核心概念
- Entry 入口
- Output 输出
- Loaders
- Plugins 插件
入口Entry
webpack.config.jsmodule.exports = {
entry: 'index.js'
}
module.exports = { |
module.exports = { |
输出Output
打包成的文件(bundle),一个或多个,可自定义规则
webpack.config.jsmodule.exports = {
entry: 'index.js',
output: {
filename: 'index.min.js'
}
}
const path = require('path') |
解析Resolve
设置模块如何被解析
webpack.config.jsmodule.exports = {
resolve: {
// 设置别名
alias: [
xyz$: path.resolve(__dirname, 'path/to/file.js')
],
// 自动解析确定的扩展
extensions: ['.js','.vue']
}
}
结果import Test1 from 'xyz'; // 精确匹配,所以 path/to/file.js 被解析和导入
import Test2 from 'xyz/file.js'; // 精确匹配,触发普通解析
import File from '../path/to/file' // 能够使用户在引入模块时不带扩展
Loaders
处理文件,转换为模块
webpack.config.jsmodule.exports = {
module: {
rules: [
{
test: /\.css$/,
use: 'css-loader'
}
]
}
}
常用loader
- 编译相关 babel-loader、ts-loader
- 样式相关 style-loader、css-loader、less-loader、postcss-loader
- 文件相关 file-loader、url-loader
Plugins
参与打包整个过程、打包优化和压缩、配置编译时的变量
webpack.config.jsconst webpack = require('webpack');
module.exports = {
plugins: [
new webpack.optimize.UglifyJsPlugin()
]
}
常用plugins
- 优化相关 CommonsChunkPlugin(提取公共代码块)、UglifyjsWebpackPlugin(混淆压缩代码)
- 功能相关 ExtractTextPlugin(单独提取CSS文件)、HtmlWebpackPlugin(生成html)、HotModuleReplacementPlugin(热更新)、CopyWebpackPlugin(引用打包好的插件)
名词
Chunk
代码块Bundle
捆,束,打包Module
模块
使用
- webpack命令
- webpack配置
- 第三方脚手架
Babel-loader 使用
- webpack 3.x | babel-loader 8.x | babel 7.x
npm install babel-loader@8.0.0-beta.0 @babel/core @babel/preset-env webpack |
- webpack 3.x babel-loader 7.x | babel 6.x
npm install babel-loader babel-core babel-preset-env webpack |
module: { |
Babel Presets
- targets
- targets.browsers
- targets.browsers: “last 2 versions” // 主流浏览器最后两个版本
- targets.browsers: “> 1%” // 主流浏览器占有率大于1%
browsers
设置,参考browserslist
数据参考Can I use
- babel默认只转换语法,而不转换新的API,如需使用新的API,还需要使用对应的
转换插件
或者polyfill
babel-polyfill
babel-polyfill
全局兼容ES6新特性,污染全局。全局垫片,为应用准备
npm install babel-polyfill --save |
使用直接import
import "babel-polyfill" |
babel-runtime & babel-plugin-transform-runtime
babel-runtime
&babel-plugin-transform-runtime
无全局污染,依赖统一按需引入,无重复引入,无多余引入。局部垫片,为开发框架准备
npm install babel-plugin-transform-runtime --save-dev |
使用转换插件
在.babelrc
文件设置
{ |
提取公用代码
- 减少代码冗余
- 提高加载速度
场景
- 单页应用
- 单页应用 + 第三方依赖
- 多页应用 + 第三方依赖 + webpack生成代码
代码分割
- 分离业务代码和第三方依赖
- 分离业务代码和业务公共代码和第三方依赖
- 分离首次加载和访问后加载的代码
style-loader
style-loader/url
也可以添加一个URL <link href="path/to/file.css" rel="stylesheet">
{
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: "style-loader/url" },
{ loader: "file-loader" }
]
}
]
}
}
style-loader/useable
是否调用这段 <style></style>
{ |
component.jsimport style from './file.css'
style.use(); // = style.ref();
style.unuse(); // = style.unref();
样式不会添加在 import/require()
上,而是在调用 use/ref
时添加。如果 unuse/unref
与 use/ref
一样频繁地被调用,那么样式将从页面中删除。
css-loader
postcss-loader
- autoprefixer 添加前缀
- cssnano 压缩
- cssnext 使用新语法(css variable, custom selectors, calc())
安装
npm install postcss postcss-loader autoprefixer cssnano postcss-cssnext --save-dev |
使用
webpack.config.js
{ |
Tree Shaking
- JS Tree Shaking
- CSS Tree Shaking
场景
- 常规优化
- 引入第三方库的某一功能
文件处理
npm install file-loader url-loader img-loader postcss-sprite --save-dev |
webpack.config.js
{ |
图片压缩img-loader
webpack.config.js
{ |
雪碧图postcss-sprites
webpack.config.js
{ |
处理第三方库的方式
- webpack.providePlugin
- imports-loader
- window
npm install imports-loader |
webpack.config.js
{ |