Appearance
1. 初始化项目
1). 生成package.json
yarn init -y
2). 创建入口js: src/index.js
console.log('Hello Webpack!')
document.getElementById('root').innerHTML = '<h1>Hello222</h1>'
3). 创建页面文件: public/index.html
<div id="root"></div>
2. webpack基本使用
1). 下载依赖包
npm remove webpack webpack-cli -g
npm install -D webpack webpack-cli
npm install -D html-webpack-plugin
2). 创建webpack配置: webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
function resolve(dir) {
return path.resolve(__dirname, dir)
}
module.exports = {
// 模式: 生产环境
// mode: 'production',
// 入口
entry: {
app: resolve('src/index.js')
},
// 出口(打包生成js)
output: {
path: resolve('dist'),
filename: 'js/[name].bundle.js',
},
// 模块加载器
module: {
rules: [
]
},
// 插件
plugins: [
new HtmlWebpackPlugin({
template: 'public/index.html',
filename: 'index.html'
})
]
}
3). 生成环境打包并运行
配置打包命令: "build": "webpack --mode production"
打包项目: yarn build
运行打包项目: serve dist (第一次全局下载serve: npm install -g serve)
3. 开发环境运行
1). 现在的问题:
每次修改项目代码后, 必须重新打包, 重新运行
2). 下载依赖包
npm install -D webpack-dev-server
3). 配置开发服务器
devServer: {
open: true, // 自动打开浏览器
port: 8080, // 指定启动服务器的端口号
stats: 'errors-only', // 只输出错误日志
},
4). 配置开启source-map调试
devtool: 'cheap-module-eval-source-map',
5). 开发环境运行
配置命令: "dev": "webpack-dev-server --mode development"
执行命令: npm run dev
4. 打包处理 ES6/CSS/图片
1). 处理ES6
a. 下载依赖包
npm install -D babel-loader @babel/core @babel/preset-env
b. 配置
{
test: /\.js$/,
//exclude: /(node_modules|bower_components)/,
include: resolve('src'),
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
c. 理解babel的plugin与preset
babel本身不编译ES6的语法
babel需要基于它的plugin来做ES语法的编译
每个语法都一个对应的babel plugin来编译对应的语法
一个babel preset包是包含多个常用的babel plugin的集合包
好处: 便于管理, 简化配置
2). 处理CSS
a. 下载依赖包
npm install -D css-loader style-loader
b. 配置
{
test: /\.css$/,
use: ['style-loader', 'css-loader'], // 多个loader从右到左处理
}
3). 处理图片
a. 下载依赖包
npm install -D url-loader@2.3.0 file-loader@4.3.0
b. 配置
{
test: /\.(png|jpe?g|gif|svg)$/,
loader: 'url-loader',
options: {
limit: 1000,
name: 'img/[name].[ext]' // 相对于output.path
}
}
4). 测试
a. 添加图片: src/assets/imgs/logo.png
b. 添加css: src/assets/css/my.css
img {
width: 200px;
height: 200px;
}
c. index.js
import logo from './assets/imgs/logo.png'
import './assets/css/my.css'
const image = new Image()
image.src = logo
document.body.appendChild(image)
document.getElementById('root').innerHTML = '<h1>Hello222</h1>'
5. 搭建vue的环境
0). 文档:
https://vue-loader.vuejs.org/zh/
1). 下载依赖包:
npm install -S vue
npm install -D vue-loader vue-template-compiler
2). 配置
const VueLoaderPlugin = require('vue-loader/lib/plugin')
{
test: /\.vue$/,
include: resolve('src'), // 只对src下的vue文件处理
loader: 'vue-loader'
}
{
test: /\.css$/,
use: ['vue-style-loader', 'css-loader'],
}
new VueLoaderPlugin()
// 引入模块的解析
resolve: {
extensions: ['.js', '.vue', '.json'], // 可以省略的后缀名
alias: { // 路径别名(简写方式)
'vue$': 'vue/dist/vue.esm.js', // 如果是引入'vue', 加载带编译的版本
'@': resolve('src'),
}
}
3). 编码:
src/App.vue
src/index.js
6. 解决开发环境ajax请求跨域问题
1). 利用webpack-dev-server进行请求代理转发
webpack-dev-server内部利用http-proxy-middle包对特定请求进行转发操作
2). 配置:
devServer: {
proxy: {
// 处理以/api开头路径的请求
// '/api': 'http://localhost:4000'
'/api': {
target: 'http://localhost:4000', // 转发的目标地址
pathRewrite: {
'^/api' : '' // 转发请求时去除路径前面的/api
},
changeOrigin: true, // 支持跨域
}
}
}
7. 配置async/await的编译环境
1). 下载包
yarn add @babel/polyfill
2). 配置
entry: {
xxx: ['@babel/polyfill', resolve('src/index.js')]
},
8. 解决mint-ui按需引入配置异常的问题
1). 文档上的配置
"plugins": [
["component", [
{
"libraryName": "mint-ui",
"style": true
}
]]
]
2). 异常信息:
Error: .plugins[0][1] must be an object, false, or undefined
3). 原因:
文档编写时, 是根据老的babel版本编写的, 新版本的babel配置有变化
以前是数组, 现在只能是对象
4). 修正:
"plugins": [
["component", {
"libraryName": "mint-ui",
"style": true
}]
]
9. 解决history模式路由请求404的问题
devServer: historyApiFallback: true, // 任意的 404 响应都被替代为 index.html
output: publicPath: '/', // 引入打包的文件时路径以/开头