【webpack4】第四部分 生产环境基本配置
文章目录
4. 生产环境基本配置
4.1 提取css为单独文件
npm install --save-dev mini-css-extract-plugin
下载插件
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
//引入插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.css$/,
use:[
// 创建 style 标签,将js样式放入head
// 'style-loader',
// MiniCssExtractPlugin.loader 取代 style-loader
// 作用:提取 js 中的 css 成单独文件
MiniCssExtractPlugin.loader,
// 将 css 文件整合到 js 文件中
'css-loader'
]
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
}),
new MiniCssExtractPlugin({
//对输出的css进行重命名
filename:'css/built.css'
})
],
mode:'development'
}
4.2 css兼容性问题
npm install --save-dev postcss-loader postcss-preset-env
需要下载的插件和loader
须知:
-
css兼容性处理:使用
postcss
需要下载:postcss-loader postcss-preset-env
loader
的默认使用:默认使用是没有办法进行配置的
默认使用的形式:xxx-loader
配置package.json中去配置,使得
postcss
能够找到
配置如下:"browserslist":{ // 开发环境 "development":[ //表示兼容最近的xx浏览器版本 "last 1 chrome version", "last 1 firefox version" ], //生产环境 "production":[ // 兼容超过99%浏览器 ">0.1%", // 死的浏览器 "not dead", "not op_mini all" ]
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
// 设置 nodejs 环境变量(默认是看生产环境)
// process.env.NODE_ENV = 'development';
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.css$/,
use:[
//提取css
MiniCssExtractPlugin.loader,
// 将 css 文件整合到 js 文件中
'css-loader',
//修改loader的默认配置需要写成对象的形式
{
//设置加载器
loader:'postcss-loader',
//配置options
options:{
postcssOptions:{
//插件
plugins:[
[
//指定环境
"postcss-preset-env",
{
//兼容浏览器最新的两个版本
browsers:'last 2 versions'
}
]
]
}
}
}
]
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
}),
new MiniCssExtractPlugin({
//重命名文件
filename:'css/built.css'
})
],
mode:'development'
}
4.3 压缩css
npm install --save-dev optimize-css-assets-webpack-plugin
需要下载的包
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
//导入压缩css的插件
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
// 设置 nodejs 环境变量(默认是看生产环境)
// process.env.NODE_ENV = 'development';
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.css$/,
use:[
//提取css
MiniCssExtractPlugin.loader,
// 将 css 文件整合到 js 文件中
'css-loader',
//修改loader的默认配置需要写成对象的形式
{
//设置加载器
loader:'postcss-loader',
//配置options
options:{
postcssOptions:{
//插件
plugins:[
[
//指定环境
"postcss-preset-env",
{
//兼容浏览器最新的两个版本
browsers:'last 2 versions'
}
]
]
}
}
}
]
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
}),
new MiniCssExtractPlugin({
//重命名文件
filename:'css/built.css'
}),
//压缩css
new OptimizeCssAssetsWebpackPlugin()
],
mode:'development'
}
4.4 js语法检查eslint
需要下载四个安装包:
npm install --save-dev eslint-loader
npm install --save-dev eslint
npm install --save-dev eslint-config-airbnb-base
npm install --save-dev eslint-plugin-import
一起下载用下面的代码:
npm install --save-dev eslint-loader eslint eslint-config-airbnb-base eslint-plugin-import
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.js$/,
// 注意:只检查自己写的源代码,第三方的库是不用检查的设置检查规则
// 语法检查: eslint-loader eslint
// 除去别人的包,不然会用问题
exclude:/node_module/, //一定要记得写
loader:'eslint-loader',
options:{
// 自动修复eslint的错误,修正格式
fix:true
}
},
{
test:/\.css$/,
use:[MiniCssExtractPlugin.loader,'css-loader']
}
]
},
plugins:[
new HtmlWebpackPlugin({
tempalte:"./src/index.html"
}),
new MiniCssExtractPlugin({
filename:'css/built.css'
})
],
mode:'development'
}
4.5 eslint兼容性问题
需要下载的包:
npm install --save-dev babel-loader
npm install --save-dev @babel/core
npm install --save-dev @babel/preset-env
npm install --save-dev @babel/polyfill
npm install --save-dev core-js
-
基本js兼容性处理 --> ·
@babel/preset-env
,使用它必须要下载babel-loader
和@babel/core
问题:只能转换基本的语法,例如promise就不能转化
-
全部的js兼容性处理 -->
@babel/polyfill
(不推荐使用)问题:我们只需要解决部分兼容性问题但是所有的兼容性代码全部引入,导致体积太大
-
需要做兼容性处理的就做:按需加载 -->
core-js
(推荐使用)
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.js$/,
// 注意:只检查自己写的源代码,第三方的库是不用检查的设置检查规则
// 语法检查: eslint-loader eslint
// 除去别人的包,不然会用问题
exclude:/node_module/, //一定要记得写
loader:'eslint-loader',
options:{
// 自动修复eslint的错误,修正格式
fix:true
}
},
{
test:/\.css$/,
use:[MiniCssExtractPlugin.loader,'css-loader']
},
{
test:/\.js$/,
exclude:/node_module/,
loader:'babel-loader',
options:{
// 预设:指示 babel 做怎么样的兼容性处理
presets:[
[
'@babel/preset-env',
{
//按需加载
useBuiltIns:'usage',
//指定core-js版本
corejs:{
verson:3
},
// 指定兼容性做到哪个版本浏览器
targets: {
chrome: '60',
firefox: '60',
ie: '9',
safari: '10',
edge: '17'
}
}
]
]
}
}
]
},
plugins:[
new HtmlWebpackPlugin({
tempalte:"./src/index.html"
}),
new MiniCssExtractPlugin({
filename:'css/built.css'
})
],
mode:'development'
}
4.6 压缩js和html代码
- 压缩js代码:只需要开启生成模式就会自动压缩
- 压缩html代码:
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry:'./src/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
plugins:[
new HtmlWebpackPlugin({
tempalte:'./src/index.html',
// 这里多个配置,就可以压缩html代码
minify:{
//移除空格
collapseWhitespace:true,
//移除注释
removeComments:true
}
})
],
// 开启生产模式就可以压缩js代码
mode:'production'
}
4.7 生产环境的基本配置
const {resolve} = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//入口文件
entry:"./src/js/index.js",
// 输出地址
output:{
filename:"js/built.js",
path:resolve(__dirname,'build')
},
//loader
module:{
rules:[
// 打包css
{
test:/\.css$/,
use:[
//提取css
MiniCssExtractPlugin.loader,
// 将 css 文件整合到 js 文件中
'css-loader',
//修改loader的默认配置需要写成对象的形式
{
//设置加载器
loader:'postcss-loader',
//配置options
options:{
postcssOptions:{
//插件
plugins:[
[
//指定环境
"postcss-preset-env",
{
browsers:'last 2 versions'
}
]
]
}
}
}
]
},
{
//打包less
test:/\.less$/,
use:[
MiniCssExtractPlugin.loader,
'css-loader',
//修改loader的默认配置需要写成对象的形式
{
//设置加载器
loader:'postcss-loader',
//配置options
options:{
postcssOptions:{
//插件
plugins:[
[
//指定环境
"postcss-preset-env",
{
browsers:'last 2 versions'
}
]
]
}
}
},
'less-loader'
]
},
{
//eslint
test:/\.js$/,
exclude:/node_module/,
loader:'eslint-loader',
// 优先执行
enforce: 'pre',
options:{
fix:true
}
},
{
test:/\.js$/,
exclude:/node_module/,
loader:'babel-loader',
options:{
// 预设:指示 babel 做怎么样的兼容性处理
presets:[
[
'@babel/preset-env',
{
//按需加载
useBuiltIns:'usage',
//指定core-js版本
corejs:{
verson:2
},
// 指定兼容性做到哪个版本浏览器
targets: {
chrome: '60',
firefox: '60',
ie: '9',
safari: '10',
edge: '17'
}
}
]
]
}
},
{
//打包图片
test:/\.(jpg|png|gif|webp)$/,
loader:'url-loader',
options:{
limit: 8*1024,
name:'[hash:10].[ext]',
outputPath:'imgs',
esModule:false
}
},
//处理html下的图片
{
test:/\.html$/,
loader:'html-loader',
options:{
esModule:false
}
},
//打包其他文件
{
exclude:/\.(js|css|less|html|jpg|png|gif)$/,
loader:'file-loader',
options:{
outputPath:'media'
}
}
]
},
plugins:[
//提取css文件
new MiniCssExtractPlugin({
filename:"css/built.css"
}),
//压缩css
new OptimizeCssAssetsWebpackPlugin(),
//打包html
new HtmlWebpackPlugin({
template:'./src/index.html',
//压缩html
minify:{
collapseWhitespace:true,
removeComments:true
}
})
],
// 开启生产模式就自动压缩js
mode:'production'
}
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!