我不懂 webpack,尤其是代码拆分和分块。我是前端开发的新手。
假设我有一个大型多页 AngularJS 应用程序,其中一些页面(但不是全部)使用由许多 AMD 模块组成的大型供应商库的片段,所有这些模块都位于单独的文件中。所以我配置了多个入口点,每个页面一个。制作以下捆绑包似乎是合理的:
- 每个页面的捆绑包,包含我的应用程序代码,可能还有 css 等
- 包含我的供应商的 AMD 模块(或至少是我的任何页面使用的所有模块)的捆绑包
- 包含多个我的应用程序页面使用的常用库(例如 Angular、jquery、moment 等)的捆绑包。
所以我做了以下网页配置:
//Webpack config.
var path = require('path');
var CommonsChunkPlugin = new require("webpack/lib/optimize/CommonsChunkPlugin");
var glob = require('glob');
module.exports = {
context: path.resolve(__dirname, 'app'),
entry: {
page1Entry: './page1Entry.js',
page2Entry: './page2Entry.js', //There are a few more of these
vendor: glob.sync("../vendor/**/*.js")
},
output: {
filename: '[name].bundle.js',
chunkFilename: "[id].chunk.js"
},
resolve: {
//Resolve non-relative path declared dependencies from the following directories.
//This means look in the context root (/app) for my app code.
//look in vendor folder for the vendor requires
//everything else look in node_modules
modulesDirectories: ['vendor', 'app', 'node_modules'],
},
plugins: [
new CommonsChunkPlugin({minChunks: 2, name: "commons"}),
new CommonsChunkPlugin({name: "vendor", chunks: ['vendor']}),
]
}
这不会产生预期的结果。我得到的是这样的:
- page1Entry.bundle.js //包含我的应用程序代码和一些供应商库
- page2Entry.bundle.js //仅包含我的应用程序代码
- vendor.bundle.js //几乎完全是空的
- commons.bundle.js //似乎是正确的,有角度等创建了一些编号的块,例如:
- 4.chunk.js //small,包含我的两个页面使用的一些应用程序逻辑。没有供应商库——为什么要创建它?
- 6.chunk.js //巨大的,包含我的一些应用程序逻辑和一些供应商库——为什么?
此外,我看到已部署的代码尝试从服务器获取编号的块,但它没有从部署所有块的我的 /deploymentcontext/js 文件夹中获取它们 - 它试图从页面 URL 加载它们(例如http ://my.domain/my/page/4.chunk.js)。如果我使用 output.publicPath 来配置它,我必须对部署上下文进行硬编码。我怎样才能解决这个问题?
我究竟做错了什么?