webpack概念
- entry
- output
- loader
- plugin
- optimization // webpack4
- externals
- mode
development 或 production
entry
单页面入口
1 | const config = { |
多页面片
filename 用于输出文件的文件名。
目标输出目录 path 的绝对路径。
1 | const config = { |
output
1 | const config = { |
多页面片入口起点
1 | { |
mode 模式
提供 mode 配置选项,告知 webpack 使用相应模式的内置优化。
1 | module.exports = { |
loader
loader 用于对模块的源代码进行转换。loader 可以使你在 import 或”加载”模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS文件!
1 | module.exports = { |
插件(plugins)
插件目的在于解决 loader 无法实现的其他事
1 | plugins: [ |
构建目标(targets)
1 | module.exports = { |
devServer本地服务器
1 | devServer: { |
模块热替换
HMR
Source Maps调试配置
作为开发,代码调试当然少不了,那么问题来了,经过打包后的文件,你是不容易找到出错的地方的,Source Map就是用来解决这个问题的
__dirname
在任何模块文件内部,可以使用__dirname变量获取当前模块文件所在目录的完整绝对路径。
配置:
configureWebpack
如果这个值是一个对象,则会通过 webpack-merge 合并到最终的配置中。
如果这个值是一个函数,则会接收被解析的配置作为参数。该函数既可以修改配置并不返回任何东西,也可以返回一个被克隆或合并过的配置版本。
Runtime
在浏览器运行时,webpack 用来连接模块化的应用程序的所有代码。runtime 包含:在模块交互时,连接模块所需的加载和解析逻辑。包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑。
Manifest
当编译器(compiler)开始执行、解析和映射应用程序时,它会保留所有模块的详细要点。这个数据集合称为 “Manifest”,当完成打包并发送到浏览器时,会在运行时通过 Manifest 来解析和加载模块。无论你选择哪种模块语法,那些 import 或 require 语句现在都已经转换为 webpack_require 方法
webpack.optimize.CommonsChunkPlugin来帮我们分离代码,将mainfest、第三方库包,业务代码独立成三个文件
1.runtime
在浏览器运行时,webpack用来连接模块化的应用程序的所有代码 runtime包含:
在模块交互时,连接模块所需的加载和解析逻辑
包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑
2.manifest
manifest数据用来管理生成的index.html文件和bundle以及各种资源,把他们加载到浏览器中
当编译器开始执行、解析和映射应用程序,会保留所有模块的详细要点. 这个集合称为Manifest
打包完成发送到浏览器 运行时通过Manifest来解析和加载模块 import 或require语句转换为 webpack require 方法 此方法指向模块标识符 通过manifest 中的数据 runtime 将能够查询模块标识符,检索出背后对应的模块
chainWebpack
是一个函数,会接收一个基于 webpack-chain 的 ChainableConfig 实例。允许对内部的 webpack 配置进行更细粒度的修改。
webpack3和webpack4对比
1.替换插件 extract-text-webpack-plugin,使用 webpack4 推荐使用的插件mini-css-extract-plugin
2.在 webpack4 中不再支持 CommonsChunkPlugin,而是使用 splitChunks 替代
- CommonsChunkPlugin 会提取一些我们不需要的代码
- 它在异步模块上效率低下
- splitChunks它不会打包不需要的模块
- splitChunks对异步模块有效(默认情况下是打开的)
webpack 4 已经废除了 之前 UglifyJsPlugin,用 optimization.minimize 替代vue-cli3使用
webpack多页面片
webpack3/4大致差不多,只是部分插件不一样
- entry单页面片 ‘./src/index.html’,多页面片
1
2
3
4
5
6
7
8
9
10{
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
} - htmlWebpackPlugins
- 使用 CommonsChunkPlugin 为每个页面间的应用程序共享代码创建 bundle。由于入口起点增多,多页应用能够复用入口起点之间的大量代码/模块,从而可以极大地从这些技术中受益。