Webpack
webpack是一个模块打包工具,把所有浏览器不能直接识别的文件打包成能识别的文件(例:html,css,js)
配置文件基础结构
{
mode:打包模式(开发环境/生产环境)
entry:构建开始的地方
output:打包输出文件的地方
module:不同模块或不同类型文件的打包方式规则
plugins:插件/文件打包后的其他附加功能(提取css)
resolve:解析/配置模块如何解析(例:增加@的别名)
devServer:服务器
externals:避免将某些import的包打入,是需要用时再从外部获取(例:从cdn获取)
}
常用loader和插件
loader:负责打包转换某种格式文件(例:less-loader 转换less)
### 编译css
css-loader:解析css导入
style-loader:css注入DOM
postcss-loader:PostCss处理css
node-sass:将Node.js绑定到LibSass,它允许用户以令人难以置信的速度将.scss文件本地编译为css,并通过连接中间件自动编译(sass-loader需要使用)
sass-loader:编译sass
less-loader:编译less
vue-style-loader:Vue作者在style-loader上扩展的(支持SSR等其他功能)
### 编译js
>因各版本浏览器语法不兼容和新增的ES6,ES7,ES8,ES9,ES10等支持程度不一样,babel可以把这些语法转换成es5浏览器识别的语言。因包太大,就拆分出@babel/core,@babel/preset-env等小包。
@babel/core
@babel/preset-env
babel-loader:编译JS语法的
### 编译vue文件
vue-loader:官方提供的
基础示例
const { VueLoaderPlugin } = require('vue-loader');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { resolve } = require('./utils.js');
const PORT = 8080;
module.exports = {
//项目打包入口文件
entry: resolve('../src/main.js'),
output: {
//项目打包文件输出地址
path: resolve('../dist'),
//文件名字格式
filename: 'js/[name].js',
},
module: {
rules: [
//处理vue文件
{
test: /\.vue$/,
use: ['vue-loader'],
},
//处理js文件
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
},
//处理图片
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
type: 'asset/resource',
generator: {
filename: 'img/[name].[hash:7].[ext]',
},
},
//处理音视频文件
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
type: 'asset/resource',
generator: {
filename: 'media/[name].[hash:7].[ext]',
},
},
//处理字体文件
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
type: 'asset/resource',
generator: {
filename: 'fonts/[name].[hash:7].[ext]',
},
},
//处理css文件
{
test: /\.css$/,
use: ['css-loader'],
},
//处理less文件
{
test: /\.less$/,
use: ['vue-style-loader', 'css-loader', 'postcss-loader', 'less-loader'],
},
//处理scss文件
{
test: /\.scss$/,
use: ['vue-style-loader', 'css-loader', 'postcss-loader', 'less-loader'],
},
],
},
plugins: [
//打包文件(js,css等)并自动插入到模版index.html中
new HtmlWebpackPlugin({
template: resolve('../public/index.html'), //模版文件
filename: 'index.html', //模版文件输出地址
title: '手搭vue-webpack',
}),
//编译vue文件
new VueLoaderPlugin(),
//复制static文件夹的文件
new CopyWebpackPlugin({
patterns: [{ from: resolve('../static'), to: resolve('../dist/static') }],
}),
],
//开发环境需要webpack服务器
devServer: {
port: PORT, // 端口
hot: true, //热加载
open: true, //自动打开浏览器
historyApiFallback: true, //404 重定向
client: {
overlay: true, //报错显示页面全屏
},
static: {
directory: resolve(__dirname, '../dist'),
publicPath: '/',
},
},
resolve: {
//import路径自动识别.js,.vue文件课省略不写
extensions: ['.js', '.vue'],
//可使用@/views/路径
alias: {
'@': resolve('../src'),
},
},
};
优化表例
开发环境:
1.有服务器
2.服务器端口占用
生产环境:
1.无服务器
2.有css提取
3.有contenthash等值
区分出
base.js 基础配置
dev.js 开发环境单独配置
prod.js 生产环境单独配置
通过webpack-merge合成 base.js+dev.js(开发完整配置),base.js+prod.js(生产完整配置)
项目参考地址:分支(前端)
https://gitee.com/training-course---framework/webpack
本人很懒