1、安装webpakck
npm install --save-dev webpack webpack-cli
刚刚安装的版本是 5.73.0
2、新建config配置文件夹
在根目录下创建一个webpack.config文件夹,在此文件夹下创建三个配置文件
- webpack.common.config.js -- 公共配置文件
- webpack.prod.config.js -- 生产环境配置文件
- webapck.dev.config.js -- 开发环境配置文件
在根目录下再创建一个src文件夹,新建 app.js文件
3、在webpack.common.config.js文件中输入以下代码
const path = require('path');
module.exports = {
entry: {
app: './src/app.js',
},
output: {
filename: 'js/bundle.js',
path: path.resolve(__dirname, '../dist'),
},
};
4、安装webpack-merge
用于合并webpack配置
npm install --save-dev webpack-merge
5、配置开发环境,生产环境webpack
const path = require('path');
module.exports = {
entry: {
app: './src/app.js'
},
output: {
filename: 'js/bundle.js',
path: path.resolve(__dirname, '../dist')
}
}
6、安装React
npm install --save react react-dom
7、修改app.js
import React, { Component } from 'react';
class App extends Component {
render() {
return (
my-project!!!!!
);
}
}
export default App;
8、在src下新增index.js,代码如下
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app.jsx';
ReactDOM.render( , document.getElementById('root'))
9、修改webpack.common.js配置文件入口为:index.js
10、安装bable
npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/plugin-proposal-class-properties @babel/plugin-transform-runtime
各个bable的作用:
- babel-loader:使用 Babel 和 webpack 来转译 JavaScript 文件。
- @babel/core:babel 的核心模块
- @babel/preset-env:转译 ES2015+的语法
- @babel/preset-react:转译 react 的 JSX
- @babel/plugin-proposal-class-properties:用来编译类(class)
- @babel/plugin-transform-runtime:防止污染全局,代码复用和减少打包体积
11、在webpack.common.js加入bable配置
const path = require('path');
module.exports = {
entry: {
app: './src/index.js'
},
output: {
filename: 'js/bundle.js',
path: path.resolve(__dirname, '../dist')
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: [
'@babel/plugin-transform-runtime',
'@babel/plugin-proposal-class-properties'
]
}
}
}
]
}
}
12、安装HtmlWebpackPlugin
npm install --save-dev html-webpack-plugin
13、配置webpack.config.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = merge(common, {
mode: 'production',
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html',
inject: 'body',
minify: {
removeComments: true
}
})
]
})
- template:基于我们自己定义的 html 文件为模板生成 html 文件
- filename:打包之后的 html 文件名字
- inject:将 js 文件注入到 body 最底部
- minify:压缩 html 文件时的配置
- removeComments:去除注释
14、生成文件添加hash值
output: {
filename: 'js/[name]-bundle-[hash:8].js',
path: path.resolve(__dirname, '../dist')
}
- [name] 打包入口名称
- [hash] 哈希串默认长度为 20,:6 为取前六位
15、打包前清理dist目录(新版本可以不引入插件)
npm install --save-dev clean-webpack-plugin
代码如下:
const { merge } = require('webpack-merge');
const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = merge(common, {
mode: 'production',
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html',
inject: 'body',
minify: {
removeComments: true
}
}),
new CleanWebpackPlugin()
]
})
注意:新版可配置output对象属性clean为true,来清理
16、安装webpack-dev-server
npm install -D webpack-dev-server
修改webpack.dev.js
const { merge } = require('webpack-merge');
const path = require('path')
const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = merge(common, {
mode: 'development',
devServer: {
// 新版本不再支持contentBase,而是使用static,路径指定有问题
// contentBase: path.join(__dirname, 'dist'),
prot: 8888,
compress: true,
static: {
directory: path.join(__dirname, '/public')
}
},
plugins: [
new HtmlWebpackPlugin({
template: 'public/index.html',
inject: 'body',
hash: false
})
]
})
- contentBase: 启服务的文件
- port: 端口号
- compress: 为每个静态文件开启[gzip压缩]
17、样式配置
安装style-loader、css-loader
npm install --save-dev style-loader css-loader
新增配置
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
},
18、打包css
安装插件
npm i -D mini-css-extract-plugin
配置打包
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
},
在插件里面新增配置
new MiniCssExtractPlugin({
filename: 'style/[name].[hash].css'
})
19、压缩打包出来的css文件
安装依赖
npm i -D css-minimizer-webpack-plugin
配置压缩
optimization: {
minimize: true,
minimizer: [new CssMinizerPlugin()]
},
20、配置less、sass
安装依赖
npm i less less-loader -D
npm i -D sass sass-loader node-sass
配置less,sass
{
test: /\.less$/,
use: [
'style-loader',
'css-loader',
'less-loader'
]
},
{
test: /\.s[ac]ss$/,
use: [
'style-loader',
'css-loader',
'sass-loader'
]
}
21、压缩js代码
下载插件
npm i -D terser-webpack-plugin
配置压缩文件
optimization: {
minimize: true,
minimizer: [
new CssMinizerPlugin(),
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true
}
}
})
]
},
22、配置css浏览器前缀
安装依赖
npm i -D postcss postcss-loader autoprefixer
在根目录,新增postcss.config.js文件,代码如下:
module.exports = {
plugins: [
require('autoprefixer')({
overrideBrowserslist: [
'Android 4.1',
'iOS 7.1',
'Chrome > 31',
'ff > 31',
'ie >= 8',
]
})
]
};
在css-loader后面新加postcss-loader
23、配置图片load,使用url-loader
安装url-loader,url-loader依赖于file-loader,所以需要安装两个loader
npm i -D file-loader url-loader
配置代码
{
test: /\.(png|jpe?g|gif)$/,
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'images',
limit: 8192
}
}
- 后缀为 jpg,png,gif 的文件,使用 url-loader 进行预处理;
- options 中的[name].[ext]表示,输出的文件名为 原来的文件名;
- outputPath 是输出到 dist 目录下的路径,即 dist/images;
- limit: 8192,指定文件的最大体积(以字节为单位)。 如果文件体积等于或大于限制,默认情况下将使用 file-loader 并将所有参数传递给它。若是小于了 8kb,将图片打包成 base64 的图片格式插入到 bundle.js 文件中,这样做的好处是,减少了 http 请求,但是如果文件过大,js 文件也会过大,得不偿失,这是为什么有 limit 的原因。
24、配置source-map
devtool: 'eval-cheap-module-source-map',
25、配置resolve.alias
resolve: {
extensions: ['.js', '.jsx', '.json', '.less', '.scss'],
modules: [ path.resolve(__dirname, '../src'), 'node_modules' ],
alias: {
'@': path.join(__dirname, '../src')
}
}
- extensions: 如果有多个文件有相同的名字,但后缀名不同,webpack 会解析列在数组首位的后缀的文件 并跳过其余的后缀。使用此选项会 覆盖默认数组,这就意味着 webpack 将不再尝试使用默认扩展来解析模块。
- modules: 如果你想要添加一个目录到模块搜索目录,此目录优先于 node_modules/ 搜索。
- alias: 创建 import 或 require 的别名,来确保模块引入变得更简单。例如,一些位于 src/ 文件夹下的常用模块