【发布时间】:2018-06-11 18:43:48
【问题描述】:
我有一个使用大包的项目(dexie.js 并不是说它对这个问题很重要),我想将它“拆分”成我可以手动包含的自己的包,因为它只是在我的一些入口点脚本中需要。
让您知道:我的 webpack 配置使用多个模块,具有多个 (6) 个入口点,所以这是我的webpack.config.js 的缩减示例:
{
context: path.join(__dirname, 'src'),
entry: {
'js/contentscript.js' : './js/contentscript.js',
'js/background.js' : './js/background.js',
'js/popup.js' : './js/popup.js',
'js/options.js' : './js/options.js',
},
output: {
path: path.join(__dirname, 'dist'),
filename: "[name]"
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: "dexie",
filename: "js/dexie.js",
minChunks: function (module) {
// this assumes your vendor imports exist in the node_modules directory
return module.context && module.context.includes("node_modules/dexie");
}
}),
... // other non relevant plugins here
]
}
问题是我没有典型的“供应商”或“通用”要求,就像许多其他项目一样。 仅在少数情况下我想包含js/dexie.js 捆绑包。
例如。在options.html,我有这个:
<script src="js/dexie.js"></script>
<script src="js/options.js"></script>
...但我不希望它用于popup.html,我想保留它:
<script src="js/popup.js"></script>
由于这也是一个 WebExtensions 项目,我绝对不希望我的内容脚本需要它!
问题是,当我打开 popup.js 时,出现错误:Uncaught ReferenceError: webpackJsonp is not defined。
有什么办法 - 不将其拆分为更多的 webpack 模块 - 以便 CommonsChunkPlugin 可以很好地处理入口点,以便只有我想要的那些会受到它的影响?
我能想到的唯一解决方案是制作另一个CommonsChunkPlugin,其行为方式与通常使用“供应商”和“通用”的方式相同。那就是:
new webpack.optimize.CommonsChunkPlugin({
name: "dexie",
filename: "js/dexie.js",
minChunks: function (module) {
// this assumes your vendor imports exist in the node_modules directory
return module.context && module.context.includes("node_modules/dexie");
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: "manifest",
filename: "js/manifest.js",
minChunks: Infinity
}),
不幸的是,这意味着我需要在所有我的脚本中包含js/manifest.js,因为这是一个WebExtension,所以这意味着我必须将它注入每个内容页面......恕我直言是一个糟糕的解决方案。
关于如何改进这一点的任何想法?我是否错误地使用了CommonsChunkPlugin?我应该使用更好的模块吗? (实际上,我还在学习 webpack!)
【问题讨论】:
标签: javascript webpack webpack-2 dexie