Overview
我正在使用 Webpack4 和 ES6 开发一个名为“共享服务”的 javascript 库,其中包含不同的子文件夹。每个子文件夹代表一个“本地子库”,其中可能包含:
- 对其他第三个库的引用,例如
lodash
等,而且还
- 对其他“子文件夹或子库”的方法的引用
Example
我已经为我的问题做了一个例子并将其推送到github:https://github.com/iarroyo5/multi-part-library-webpack https://github.com/iarroyo5/multi-part-library-webpack。很有帮助的是,它应该像下面一样简单Readme
文件以便执行它:)
Issues
-
在我的示例中,我将其命名为“共享服务”图书馆作为“多部分库 webpack”。有两个“子文件夹”:api
and path
。目标是双方sub-folders/sub-libraries
可以通过这种方式获得:
import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";
import { getUserPath } from '@iarroyo/multi-part-library-webpack/path";
在提供的示例中,我已经实现了我的目标! ...Webpack 输出是 3 个文件:
-
index.js
--> 包含来自的所有方法api
and path
as apiLib
and pathLib
-
api.js
--> 包含api
methods
-
path.js
---> 包含path
方法和api
methods :(
but my 未解决的大问题由此而来^.由于一些方法api
正在被进口到path
库(每个文件夹必须是sub-library
本身并且它们可以在其他文件夹中使用)webpackpath.js
文件包含api
完全子文件夹。
在示例中path
正在使用lodash
,但第三个库没有被导出,因为我已将它们添加到externals
Webpack 选项,所以这至少是有效的。
-
这并不理想,还有一个大问题:
import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";
^ 这完全没问题,它返回正确的值,因为这些命名的导入来自api
,但是...我也可以这样做:
import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/path";
因为所有方法都来自api
在里面path
...唯一的区别是这些方法/变量的值是undefined
...所以这个解决方案根本不理想,因为有些人可能会尝试使用它methods
, variables
和path
库应该抛出一个异常,例如invalid method...
应用见解
我尝试过添加每个子文件夹作为外部的,我想也许 Webpack 会认识到它们是彼此的外部......但这没有帮助。
我已经添加了选项"sideEffects": false
为了启用Tree Shaking
与 Webpack 4 一起使用,但显然它根本不起作用。我读到关于tree-shaking
无法使用以下命令转译代码babel-loader
但我不太确定 webpack4 中是否已经解决了这个问题(似乎官方 webpack 发布日志说是......但是!!)。
无论如何,我也将其从webpack-config
并尝试了一下tree-shaking
也不工作...(我需要babel-loader
对于我的最终图书馆,所以这是一个要求)
I've tried with DllPlugin
and I've reviewed all the Webpack examples https://github.com/webpack/webpack/tree/master/examples to try to get some fresh ideas, but splitting into chunks
files I think is not a solution for ¯this reason:
如您所见,使用optimization.splitChunks
webpack4 的选项我有可重用的代码,但问题是当我生成最终的commonjs2
我无法访问我的图书馆sub-libraries
like
import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";
import { getUserPath } from '@iarroyo/multi-part-library-webpack/path";
这不再起作用了! :(因为现在所有的方法都在commons-index-path.js
and commons-api-index-path.j and
api.jsand
path.js` 是缩小的文件,当我尝试访问它们的方法时,它们会抛出此错误:
ReferenceError: window is not defined
at /Users/inakiarroyo/workspace/spartancode/export-library/dist/index.js:1:1011
at Object.<anonymous> (/Users/inakiarroyo/workspace/spartancode/export-library/dist/index.js:1:1163)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/inakiarroyo/workspace/spartancode/export-library/dev/es6-lib.js:3:25)
error An unexpected error occurred: "Command failed.
这个帖子使用 webpack 多部分库示例文件时未定义窗口 https://stackoverflow.com/questions/49304790/window-is-not-defined-when-consuming-webpack-multi-part-library-sample-files可能有关系。
我期待 webpack 会保存对我的方法的引用,我将能够使用api.js
and path.js
,但再次:(
可能的解决方案
我认为它可行的唯一方法是拥有一个package.json
每个“子文件夹”进入"multi-part-library-webpack"
运行这些“children-webpack”运行程序以生成每个库,并拥有另一个将用作 webpack 的“parent-webpack”运行程序entry
为每个“child-webpack”生成的每个子文件...但说实话,这听起来像是一个混乱的解决方案.
我想做的事情真的有可能吗Webpack4
?
- 有谁知道这是否可能Rollup https://rollupjs.org/guide/en ?