概述
我正在使用Webpack4&amp ;;开发一个javascript库。 ES6称为:“共享服务”,包含不同的子文件夹。这些子文件夹中的每一个都代表一个“本地子库”,里面可以包含:
lodash
等,但也示例
我做了一个我的问题的例子并将其推送到github:https://github.com/iarroyo5/multi-part-library-webpack。有用的是它应该像遵循Readme
文件一样简单,以便执行它:)
问题
在我的示例中,我将“shared-services”库命名为“multi-part-library-webpack”。有两个“子文件夹”:api
和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
和path
中apiLib
和pathLib
api.js
- >包含api
种方法path.js
--->包含path
方法和 api
方法 :( 但我的未解决的大问题来自于此^。由于某些api
方法被导入path
库(每个文件夹必须是sub-library
本身,并且可以在其他文件夹中使用)webpack {{1 } file完全包含path.js
子文件夹。
在示例中api
正在使用path
,但是第三个库没有被导出,因为我已将它们添加到lodash
Webpack选项中,所以这至少有效。
这不太理想,还有另一个大问题:
externals
^这是完全正常的,并且它返回正确的值,因为名为imports的这些来自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
Applied Insights
我已经尝试将每个子文件夹添加为外部,这样我就会想到也许Webpack会认识到他们是彼此外在的......但是这并不是'帮助。
我添加了选项invalid method...
以便使用Webpack 4启用"sideEffects": false
,但显然它根本不起作用。我读到Tree Shaking
无法使用tree-shaking
转换代码,但我不确定这是否已在webpack4中解决(似乎官方webpack发布日志说是......但是! !)。
在任何情况下,我也已将其从babel-loader
中移除并尝试了一下,而webpack-config
也无效...(我需要tree-shaking
作为我的最终库,所以这是一项要求)
我尝试了babel-loader
并且我已经审核了所有Webpack examples以尝试获得一些新的想法,但我认为分成DllPlugin
个文件不是出于这个原因的解决方案:
正如您所看到的,使用webpack4的chunks
选项我有可重复使用的代码,但问题是,当我生成最终的optimization.splitChunks
库时,我无法访问commonjs2
喜欢
sub-libraries
这不再适用了!! :( 因为现在所有的方法都在import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";
import { getUserPath } from '@iarroyo/multi-part-library-webpack/path";
和commons-index-path.js
api.js commons-api-index-path.j and
path.js`是缩小的文件,当我试图访问这些方法时他们抛出了这个错误:
and
这篇文章window is not defined when consuming webpack multi-part-library sample files可能是相关的。
我当时希望webpack可以保存对我的方法的引用,我将能够使用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.
和api.js
,但是又一次:(
可能的解决方案
我认为它可以工作的唯一方法是在运行这些“children-webpack”运行程序的path.js
中每个“子文件夹”有一个package.json
,以便生成每个库和有另一个“parent-webpack”运行器,它将使用为每个“child-webpack”生成的每个子文件作为webpack "multi-part-library-webpack"
... 但老实说这听起来像一个混乱的解决方案。
我真的可以尝试使用entry
吗?