简单来说webpack的作用就是把我们发环境的代码打包成生成环境的代码
核心概念
entry 入口的职责是要把什么进行编译
output 出口的作用是编译后成什么样子
Loader 进行文件的转换,作用是文件编译
plugin 文件转换后增强一系列的后续操作,可以理解为管道,不参与文件的编译
mode 开发环境还是生成环境
webpack配置
先放出来最终代码地址,如果你赖的自己敲可以复制对应的代码:https://github.com/yjxf8285/webpack-learn
1 首先创建一个项目文件夹,然后在终端中使用npm init -y 命令生成package.json文件,例如:
{
"name": "webpack-learn",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
熟悉webpack核心概念
1.1 安装必要的3个依赖
"devDependencies": {
"webpack": "4.43.0",
"webpack-cli": "3.3.11",
"webpack-dev-server": "3.11.0"
}
1.2 创建webpack配置文件webpack.config.js
module.exports = {
mode: 'development',
// mode: 'production', // 编译后的文件会压缩
entry: './src/index.js',
output: {
filename: 'index.js' // 指定输入文件的文件名
},
}
1.3 执行编译
创建src目录,并在src目录下新建index.js文件,然后执行npx webpack命令,会生成dist目录和index.js编译后的文件
1.4 使用模板插件和拷贝文件
先安装下面这两个插件的依赖,注意版本号
"devDependencies": {
"copy-webpack-plugin": "5.1.1",
"html-webpack-plugin": "4.3.0",
...
配置文件中添加对应的配置
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyPlugin = require("copy-webpack-plugin")
module.exports = {
mode: 'development',
// mode: 'production', // 编译后的文件会压缩
entry: './src/index.js',
output: {
filename: 'index.js' // 指定输入文件的文件名
},
plugins: [
// new HtmlWebpackPlugin() // 编译后自动生成html文件并引入出口的js文件
new HtmlWebpackPlugin({
template: './src/index.html' // 手动指定index.html的模板
}),
new CopyPlugin([{ from: "static", to: "static" }]), // 拷贝文件到编译后的目录
]
}
src目录下创建index.html模板文件,根目录创建static文件夹,然后在里面新建一些js文件。再执行编译后,可以在dist目录下得到对应的模板和拷贝过去的静态文件
2 拆分配置文件,分别为开发环境和生产环境
需要安装2个依赖,后面要用
"devDependencies": {
"webpack-merge": "4.2.2",
"clean-webpack-plugin": "3.0.0",
...
新建一个build目录,然后创建4个文件
webpack.base.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyPlugin = require("copy-webpack-plugin")
module.exports = {
entry: './src/index.js',
output: {
filename: 'index.js' // 指定输入文件的文件名
},
plugins: [
// new HtmlWebpackPlugin() // 编译后自动生成html文件并引入出口的js文件
new HtmlWebpackPlugin({
template: './src/index.html' // 手动指定index.html的模板
}),
new CopyPlugin([{ from: "static", to: "static" }]), // 拷贝文件到编译后的目录
]
}
webpack.dev.config.js
module.exports = {
devtool: 'cheap-module-eval-source-map' // 生成一个没有列信息(column-mappings)的 SourceMaps 文件,同时 loader 的 sourcemap 也被简化为只包含对应行的。
}
webpack.pro.config.js
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
module.exports = {
plugins: [
new CleanWebpackPlugin() // 每次编译会自动删除dist目录
]
}
webpack.config.js
const merge = require('webpack-merge')
const baseConfig = require('./webpack.base.config')
const devConfig = require('./webpack.dev.config')
const proConfig = require('./webpack.pro.config')
module.exports = (env, argv) => {
const config = argv.mode === 'development' ? devConfig : proConfig
return merge(baseConfig, config)
}
在package.json中编辑运行脚本
"scripts": {
"start": "webpack-dev-server --mode=development --config ./build/webpack.config.js",
"build": "webpack --mode=production --config ./build/webpack.config.js"
},
现在可以根据脚本中指定的mode加载不同的配置文件,并merge基本的配置文件了
3 添加babel支持
先安装3个依赖
"@babel/core": "7.9.6",
"@babel/preset-env": "7.9.6",
"babel-loader": "8.1.0",
在webpack.base.config.js中添加规则
module: {
rules: [{
test: /\.js$/, // 匹配js结尾的文件
exclude: /node_modules/, // 排除依赖包目录
use: {
loader: 'babel-loader', // 使用哪个loader来翻译
options: {
presets: [ //
['@babel/preset-env', { // @babel/preset-env 根据指定的执行环境提供语法装换,也提供配置 polyfill。
// "useBuiltIns": false, // 不对 polyfill 做操作。
"useBuiltIns": "entry" // 根据配置的浏览器兼容版本范围,引入浏览器不兼容的 polyfill
}]
]
}
}
}]
}
现在项目支持es11语法了,可以试试,如果不行,看看和实例代码的项目有什么区别。