@Dale-Lin
2022-08-04T12:37:38.000000Z
字数 2058
阅读 587
webpack5
webpack 的运行逻辑是从 entry 指定的入口文件开始,递归加载、构建项目资源。
entry 支持以下类型字段:
例如对象类型:
module.exports = {// ...entry: {// stringhome: './home.js',// arrayshared: ['react', 'react-dom', 'redux', 'react-redux'],// objectpersonal: {import: './person.js',filename: 'pages/personal.js',dependOn: 'shared',chunkLoading: 'jsonp',asyncChunks: true},// functionadmin: function() {return './admin.js';}}}
对象类型配置中最为复杂,支持以下属性:
import:声明入口文件,可以是字符串单入口/数组多入口;dependOn:这个入口加载时的前置依赖 bundle,会认为 dependOn 指向的 entry 的 bundle 是当前 bundle 的依赖模块,从而把 dependOn 包含的代码剔除;runtime:设置 Runtime Chunk,若有这个设置,webpack 会把该入口的运行时代码抽成单独的 bundle;filename:产物路径;library:声明该入口的 output.library(构建 npm library 时使用);publicPath:声明该入口文件的服务器路径;chunkLoading:效果和 output.chunkLoading 相同,声明异步模块加载的方案,支持 false/jsonp/require/import 等值;asyncChunks:效果和 output.asyncChunks 相同,声明是否支持异步模块加载,默认 true。dependOn 属性声明前置 bundle 依赖,能够减少重复代码构建,优化构建产物质量:
const path = require("path");module.exports = {mode: "development",devtool: false,entry: {main: "./src/index.js",foo: {import: "./src/foo.js",// 避免重复 bundle 代码dependOn: "main"},},output: {clean: true,filename: "[name].js",path: path.resolve(__dirname, "dist"),},}
foo entry 声明了 dependOn 为 main entry 的构建产物,webpck 会认为 client 在加载 foo 的 bundle 之前必然会加载 main,因此可以将重复的模块代码、webpack 运行时代码都放到 main 的 bundle 中,减少不必要的重复;
dependOn适用于有明确入口依赖的场景,例如主框架 bundle 包含了项目的基本框架(例如 React),还另外对每个页面单独构建了 bundle(不需要独立运行),此时可以用dependOn属性优化产物内容。
为了支持 bundle 代码在各种环境下运行,webpack 会在产物中注入一系列运行时代码,取决于我们用到了多少特性,例如:
__webpack_require__.r 等;__webpack_require__.1 等;runtime 声明把当前 entry 的 bundle 的运行时代码抽成单独的一个 chunk,多个 entry 声明同样的 entry 可以把两个入口的运行时代码抽到同一个单独的 chunk 里:
const path = require("path");module.exports = {mode: "development",devtool: false,entry: {main: { import: "./src/index.js", runtime: "common-runtime" },foo: { import: "./src/foo.js", runtime: "common-runtime" },},output: {clean: true,filename: "[name].js",path: path.resolve(__dirname, "dist"),},};
这里把 main 和 foo entry 的运行时代码都抽到 common-runtime 文件里。