首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第5章 样式处理
5.1 分离样式文件
5.1.1 extract-text-webpack-plugin
5.1.2 多样式文件的处理
5.1.3 mini-css-extract-plugin
5.2 样式预处理
5.2.1 Sass与SCSS
5.2.2 Less
5.3 PostCSS
5.3.1 PostCSS与Webpack
5.3.2 自动前缀
5.3.3 stylelint
5.3.4 CSSNext
5.4 CSS Modules
第6章 代码分片
6.1 通过入口划分代码
6.2 CommonsChunkPlugin
6.2.1 提取vendor
6.2.2 设置提取范围
6.2.3 设置提取规则
6.2.4 hash与长效缓存
6.2.5 CommonsChunkPlugin的不足
6.3 optimization.SplitChunks
6.3.1 从命令式到声明式
6.3.2 默认的异步提取
6.3.3 配置
6.4 资源异步加载
6.4.1 import()
6.4.2 异步chunk的配置
第7章 生产环境配置
7.1 环境配置的封装
7.2 开启production模式
7.3 环境变量
7.4 source-map
7.4.1 source-map原理
7.4.2 source-map配置
7.4.3 source-map安全
7.5 资源压缩
7.5.1 压缩JavaScript
7.5.2 压缩CSS
7.6 缓存
7.6.1 资源hash
7.6.2 输出动态HTML
7.6.3 使chunk id更稳定
7.7 bundle体积监控和分析
第8章 打包优化
8.1 HappyPack
8.1.1 工作原理
8.1.2 单个loader的优化
8.1.3 多个loader的优化
8.2 缩小打包作用域
8.2.1 exclude和include
8.2.2 noParse
8.2.3 IgnorePlugin
8.2.4 缓存
8.3 动态链接库与DllPlugin
8.3.1 vendor配置
8.3.2 vendor打包
8.3.3 链接到业务代码
8.3.4 潜在问题
8.4 去除死代码
8.4.1 ES6 Module
8.4.2 使用Webpack进行依赖关系构建
8.4.3 使用压缩工具去除死代码
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(中)
小册名称:Webpack实战:入门、进阶与调优(中)
### 6.1 通过入口划分代码 在Webpack的世界里,**入口(Entry)**是配置中至关重要的一个环节,它定义了Webpack应该使用哪个文件作为构建其内部依赖图的开始。合理地通过入口划分代码,不仅可以提升项目的组织性、可维护性,还能优化构建过程,实现按需加载,减少资源加载时间,提升用户体验。本章将深入探讨如何通过入口划分代码,以及这一做法带来的多方面好处。 #### 6.1.1 理解Webpack入口配置 Webpack的入口配置通常是一个对象或数组,指定了Webpack应该从哪里开始打包应用程序。最基础的配置形式是一个字符串,表示一个入口文件的路径。然而,在复杂项目中,我们通常需要更灵活的配置方式,如多入口配置,以便对不同的页面或功能块进行独立打包。 ##### 单入口配置示例 ```javascript module.exports = { entry: './src/index.js', // 其他配置... }; ``` ##### 多入口配置示例 ```javascript module.exports = { entry: { main: './src/index.js', vendor: './src/vendor.js', admin: './src/admin.js' }, // 其他配置... }; ``` 在多入口配置中,每个键(如`main`、`vendor`、`admin`)对应一个入口起点,其值是一个字符串或数组,指向入口文件的路径。这种方式允许Webpack为不同的入口文件生成独立的bundle,非常适合单页应用(SPA)中不同页面或模块的场景。 #### 6.1.2 为什么要通过入口划分代码 1. **代码模块化**:通过入口划分,可以将项目拆分成多个更小的、更易于管理的模块。每个模块可以独立构建、测试和维护,降低了项目的复杂度和出错率。 2. **优化加载时间**:对于大型应用,将所有代码打包成一个文件会导致文件体积庞大,加载时间长。通过入口划分,可以将不常用的代码或页面分离到单独的bundle中,实现按需加载,减少初始加载时间。 3. **缓存优化**:当项目更新时,只有变更的模块需要重新构建和下载,未变更的模块可以继续使用缓存,从而提升了加载速度和用户体验。 4. **并行加载**:对于多页面应用(MPA),每个页面都可以有自己的入口文件,这样浏览器可以同时并行加载多个页面资源,提升整体加载效率。 5. **代码分割(Code Splitting)**:结合动态导入(如`import()`语法),可以进一步实现代码的动态分割,按需加载,这对于构建大型应用尤其重要。 #### 6.1.3 实现入口划分的方法 ##### 1. 手动配置多入口 如前所述,在Webpack配置文件中直接指定多个入口点是实现代码划分的基本方式。通过为不同的页面或功能指定不同的入口文件,Webpack会自动处理它们之间的依赖关系,并生成相应的bundle。 ##### 2. 利用HTML插件自动生成入口 对于多页面应用,手动管理多个HTML文件和对应的入口配置可能会变得繁琐。此时,可以使用如`html-webpack-plugin`及其变体(如`html-webpack-tags-plugin`、`mini-html-webpack-plugin`等)来自动生成HTML文件,并根据配置为每个HTML文件指定相应的入口。 ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { home: './src/home.js', about: './src/about.js' }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', chunks: ['home'] }), new HtmlWebpackPlugin({ filename: 'about.html', template: './src/about.html', chunks: ['about'] }) ] // 其他配置... }; ``` ##### 3. 使用动态导入实现代码分割 除了通过入口配置直接划分代码外,Webpack还支持使用动态`import()`语法来按需加载模块。这种方式不需要在Webpack配置中显式声明多个入口点,而是在代码层面根据需要动态地加载模块。 ```javascript // 假设有一个异步加载的组件 button.onclick = e => import('./AsyncComponent').then(module => { const AsyncComponent = module.default; // 使用AsyncComponent }); ``` Webpack会自动将`import()`请求的代码分割到一个新的bundle中,并在运行时按需加载这个bundle。 #### 6.1.4 注意事项与最佳实践 - **避免入口文件过大**:每个入口文件应尽可能保持小巧,只包含启动该模块所必需的代码。 - **合理命名**:为入口点和生成的bundle设置清晰、有意义的名称,便于管理和调试。 - **利用缓存**:合理配置文件名中的hash值,以便在文件内容未变时利用浏览器缓存。 - **优化公共代码**:使用`SplitChunksPlugin`(Webpack 4+内置)等插件来提取并共享多个入口点之间的公共代码,减少重复加载。 - **测试与验证**:在进行入口划分后,务必进行全面的测试,确保所有功能按预期工作,同时验证加载性能是否有所提升。 通过精心设计的入口划分策略,Webpack能够帮助我们构建出既高效又易于维护的前端项目。无论是单页应用还是多页面应用,都能从中受益,实现更快、更灵活的代码组织和加载。
上一篇:
第6章 代码分片
下一篇:
6.2 CommonsChunkPlugin
该分类下的相关小册推荐:
Webpack实战:入门、进阶与调优(上)
Webpack零基础入门
全解webpack前端开发环境定制
webpack指南
Webpack实战:入门、进阶与调优(下)