核心概念之Entry
Entry用来指定 webpack 的打包入口
理解依赖图的含义
依赖图入口是entry
对于非代码,比如图片,字体也会不断添加到依赖图中
单入口:entry是一个字符串
module.exports = {entry: './path/to/my/entry/file.js'}
多入口:entry是一个对象
module.exports = {
entry: {
app: './src/app.js',
adminApp: './src/adminApp.js'
}
}
核心概念之Output
Output用来告诉webpack如何将编译后的文件输出到磁盘
在entry中有多个入口,在output中没有多入口的说法
多入口配置
通过占位符确保文件名称的唯一
对于单入口ouput,filename可以写死,比如
filename: 'bundle.js'
多入口的output,需要使用占位符进行区分
filename: '[name].js'
完整版
module.exports = {
entry: {
index: './src/index.js',
search: './src/search.js'
},
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js',
}
}
核心概念之Loaders
webpack开箱即用只支持JS和JSON两种文件类型,通过Loaders去支持其它文件类型并且把它们转化成有效的模块,并且可以添加到依赖图中
Loades本身是一个函数,接受源文件作为参数,返回转换对比结果
常见的Loaders有哪些
| babel-loader | 转换ES6,ES7等JS新特性语法 |
|---|---|
| css-loader | 支持.css文件的加载和解析 |
| less-loader | 将less文件转换为css |
| ts-loader | 将TS转换为JS |
| file-loader | 进行图片,字体等的打包 |
| raw-loader | 将文件以字符串的形式导入 |
| thread-loader | 多进程打包JS和CSS |
Loaders的用法
module.exports = {
output: {
filename: 'bundle.js'
},
module: {
rules: [
{test: /\.txt$/, use: 'raw-loader'}
]
}
}
test指定匹配规则,use指定使用的loader名称
核心概念之Plugins
插件用于bundle文件的优化,资源管理和环境变量注入,作用于整个构建过程
增强Loaders,Loaders中无法做到的事情,可以通过Plugins完成
比如:构建之前需要手动删除目录
常见的Plugins有哪些
| CommonChunkPlugin | 将chunks相同的模块代码提取成公共js |
|---|---|
| CleanWebpackPlugin | 清理构建目录 |
| ExtractTextWebpackPlugin | 将CSS从.bundle文件里提取成一个独立的CSS文件 |
| CopyWebpackPlugin | 将文件或者文件夹拷贝到构建的输出目录 |
| HtmlWebpackPlugin | 创建HTML文件去承载输出的bundle |
| UglifyjsWebpackPlugin | 压缩JS |
| ZipWebpackPlugin | 将打包出的资源生成一个zip包 |
Plugins的用法
module.exports = {
output: {
filename: 'bundle.js'
},
plugins: [
new HtmlWebpackPlugin({template:
'./src/index.html'
})
]
}
将Plugin插件放在plugins数组中
webpack核心概念之Mode
Mode用来指定当前构建环境是:production、development还是none
设置mode可以使用webpack内置的函数,默认值为production
Mode是webpack4提出的新概念
生产方式区别
webpack有两种操作模式:开发(development )和(production)
在开发模式中,为了便于代码调试方便我们快速定位错误,不会压缩混淆源代码。相反,在生产模式下,webpac k进行了许多优化:
- 使用
TerserWebpackPlugin进行缩小以减小 bundle 的大小 - 使用
ModuleConcatenationPlugin提升作用域
Mode的内置函数功能
| development | 设置process.env.NODE_ENV的值为development,开启NameChunkPlugin和NameModulePlugin |
|---|---|
| production | 设置process.env.NODE_ENV的值为production,开启FlagDependencyUsagePlugin,FlagIncludedChunksPlugin,ModuleConcatenationPlugin,noEmitOnErrorsPlugin,OccurrenceOrderPlugin,SiderEffectsFlagPlugin和TerserPlugin |
| none | 不开启任何优化选项 |
Code spliting
- 避免出现一个很大的 bundle
- 避免重复的依赖关系
在 webpack 中有三种激活 code splitting 的主要方法:
- 有多个入口点
- 使用
optimization.splitChunks选项 - 动态导入
第一种基于多个入口点的技术适用于较小的项目,但是从长远来看它是不可扩展的。这里我们只关注第二和第三种方式。
