Webpack入门到进阶
1. 概念
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle(包)。
2. 核心概念
entry:入口 ==> 指示 webpack 应该使用哪个模块开始进行打包
output: 输出(出口) ==> 告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist
loader: 因为webpack 自身只理解 `js和json文件`,loader 让 webpack 能够去处理那些非 `js和json 文件`
plugins: loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务,例如:`打包优化`、`压缩`和` 重新定义环境中的变量`
mode: 模式 ==> 设置当前环境为`development(开发环境)/production(生产环境)`,默认值为`production`
3. 开启项目
1. 初始化`package.json` ==> npm init -y/yarn init -y
2. 安装webpack
npm i webpack webpack-cli -D
3. 可在`package.json中配置启动指令`
"scripts":{
"start": "webpack"
}
4. 运行webpack在终端输入`npm start`
4. 使用webpack配置文件
1. 项目根目录下新建一个`webpack.config.js`
2. 项目目录结构
node_modules/
src/
js/
main.js
index.html
webpack.config.js
package.json
2. 基本配置:
const { resolve } = require('path')
module.exports = {
entry: './src/js/main.js',
output: {
filename: 'xh.js',
path: resolve(__dirname, 'build')
},
module: {
rules: []
},
plugins: [],
mode: 'development'
}
5. 处理css文件
在rules中:
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
6. 处理less文件
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
7. 处理样式中图片资源
{
test: /\.(png|jpe?g|gif)$/,
loader: 'url-loader',
options: {
limit: 1024 * 16,
name: './imgs/[name].[ext]'
}
},
8. 处理html中图片资源
{
test: /\.html$/,
loader: 'html-loader'
}
9. 处理字体图标
{
test: /\.(eot|svg|ttf|woff)$/,
loader: 'file-loader',
options: {
name: '[hash:10].[ext]',
outputPath: 'media'
}
}
10. eslint的处理
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'eslint-loader',
options: {
fix: true
},
},
此时我们如果进行打包,会报一个警告,警告内容如下:
`Module Warning (from ./node_modules/eslint-loader/dist/cjs.js):
No ESLint configuration found`
意思是说我们没有配置eslint文件,我们在根目录下新建一个`.eslintrc`文件,然后配置一下,我们这里为了方便,就借助了一下别人写好的配置
{
"extends": "airbnb-base",
"rules": {
"import/prefer-default-export": 0,
"no-console": 0
}
}
11. css提取成单独文件
1. 引入
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
2. plugins中实例化
new MiniCssExtractPlugin({
filename: 'css/[hash:10].css',
chunkFilename: '[id].css',
})
3. 替换掉style-loader,换成MiniCssExtractPlugin.loader
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
},
12. 路径问题
当我们把style-loader 替换成MiniCssExtractPlugin.loader,出现了路径问题,这时我们就需要把`相对路径变成绝对路径`,
output: {
filename: 'js/xh.js',
path: resolve(__dirname, 'build'),
publicPath: '/'
},
然后把之前写的`./`干掉,
之后我们通过`serve [打包后的目录名]`运行,它会针对我们的打包目录开启一个服务器,这样就可以解决问题了
13. css兼容性处理
1. yarn add postcss-loader -D/npm i postcss-loader -D
2. 例:
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: (loader) => [
require('postcss-import')({ root: loader.resourcePath }),
require('postcss-cssnext')(),
require('cssnano')()
]
}
},
'less-loader'
]
},
3. yarn add postcss-import postcss-cssnext cssnano -D或者npm
4. 在package.json中(package.json中去除注释)
"browserslist": [
"> 0.05%",
"not ie <= 8"
]
14. 压缩css
1. 下载 optimize-css-assets-webpack-plugin
2. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
3. 插件中实例化
new OptimizeCSSAssetsPlugin()
15. js兼容性处理
1. npm install babel-loader@8.0.0-beta.0 @babel/core @babel/preset-env
2. 配置loader
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: [
[
"@babel/env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1",
"ie": 8
},
"useBuiltIns": "usage",
"corejs": {
version: 3
}
},
]
]
}
}
}
}
`如果之前配置过eslint的话,需要在eslint配置里面加一个enforce:'pre'让eslint优先执行`
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'eslint-loader',
enforce: 'pre',
options: {
fix: true
},
},
16. 压缩html
在 HtmlWebpackPlugin配置对象中添加相关压缩代码
new HtmlWebpackPlugin({
template: resolve(__dirname, 'src/index.html'),
minify: {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
}
}),
17. devtool
源代码映射: `因为我们运行的是打包后的文件,是经过压缩的,所以如果出错了,通过控制台查看不到源代码的错误,所以我们需要这样一个配置,让我们即使打包后的文件出错,也能追踪到源代码`
推荐配置:
开发环境: devtool: 'cheap-module-eval-source-map'
生产环境: devtool: 'source-map'
18. 完成开发环境自动化配置
devServer: {
contentBase: resolve(__dirname, "build"),
compress: true,
port: 3000,
open: true,
hot: true
},
19. 区分开发环境和生产环境
20. 个人
具体参考在我的github地址: https://github.com/Zheng-Changfu/Personal-blog
看完觉得不错记得点个star哦~~
下次我们来深入webpack优化、以及在vue/react中应该怎样配置webpack