webpack
提取css成单独文件
先用以往的开发模式来打包。创建以下文件夹,build里的内容是打包后生成的。
index.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
</body>
</html>
index.js代码
import '../css/text1.css';
import '../css/text2.css'
webpack.config.js代码
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: './js/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build'),
},
module: {
rules:
[
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
},
plugins: [
new HtmlwebpackPlugin(
{
template: './index.html'
}
)
]
}
text1.css代码
#box1 {
width: 100px;
height: 100px;
background-color: pink;
}
text2.css代码
#box2 {
width: 200px;
height: 200px;
background-color: deeppink;
}
随后打开终端输入:
npm init
npm i webpack_css
npm i webpack webpack-cli -D
npm i css-loader style-loader -D
npm i html-wenpack-plugin -D
在下载好相关包后,打开package.json,修改内部的scripts代码。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack --mode development",
"build": "webpack --mode production"
},
然后终端输入:
npm run dev
最后打开build文件夹下生成的index.html查看效果
那么此时我们使用传统的手法打包成功了。打开生成的built.js发现,之前的css样式被写在了这里面,现在想提取出来,使成为单独的文件。
下载插件npm i mini-css-extract-plugin -D
。
然后修改config内的代码。使用该插件
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
entry: './js/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build'),
},
module: {
rules:
[
{
test: /\.css$/,
use:
[
// 创建style标签,将样式放入
// 'style-loader',所以想提取css成单独文件时,这里不能把css样式放入
// 使用下边的插件进行取代,提取js中的css成单独文件
MiniCssExtractPlugin.loader,
// 将css文件整合到js文件中
'css-loader'
]
}
]
},
plugins: [
new HtmlwebpackPlugin(
{
template: './index.html'
}
),
new MiniCssExtractPlugin(
{
// 对输出的文件重命名
filename: 'built.css'
}
)
]
}
那么此时,运行npm run dev
,build文件夹下有一个built.css生成。同文件夹下的index.html引入样式的方法变为了通过link标签引入。最后在打开index.html查看效果
css的兼容性处理
将上一节代码全部复制过来,重命名。然后只修改config配置。css兼容性处理: postcss --> 需要插件postcss-loader 、postcss-preset-env。终端中输入下述命令下载。
npm i postcss-loader postcss-preset-env -D
config.js代码
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
// 设置node.js环境变量,使其默认是处于开发环境development,不是生产环境
process.env.NODE_ENV = 'development'
module.exports = {
entry: './js/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build'),
},
module: {
rules:
[
{
test: /\.css$/,
use:
[
// 创建style标签,将样式放入
// 'style-loader',所以想提取css成单独文件时,这里不能把css样式放入
// 使用下边的插件进行取代,提取js中的css成单独文件
MiniCssExtractPlugin.loader,
// 将css文件整合到js文件中
'css-loader',
//css兼容性处理: postcss --> 插件postcss-loader 、postcss-preset-env
//这些插件帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
//使用loader的默认配置
//"postcss-loader',
//修改loader的配置
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [require('postcss-preset-env')()]
}
}
}
]
}
]
},
plugins: [
new HtmlwebpackPlugin(
{
template: './index.html'
}
),
new MiniCssExtractPlugin(
{
// 对输出的文件重命名
filename: 'built.css'
}
)
]
}
在pachage.json中修改browserslist配置。其中browserslist的development部分表示兼容最近一个版本的浏览器,production中表示兼容百分之99.8的浏览器,不要兼容已经停用的浏览器。
{
"name": "webpack_css",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack --mode development",
"build": "webpack --mode production"
},
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^6.5.1",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.4.5",
"postcss-loader": "^6.2.1",
"postcss-preset-env": "^7.1.0",
"style-loader": "^3.3.1",
"webpack": "^5.65.0",
"webpack-cli": "^4.9.1"
},
"browserslist": {
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
],
"production": [
">0.2%",
"not dead",
"not op_mini all"
]
}
}
修改text1.css的内容,增加新样式。
#box1 {
width: 100px;
height: 100px;
background-color: pink;
/* 增加两个在特定浏览器有兼容性问题的样式 */
display: flex;
backface-visibility: hidden;
}
随后输入npm run dev
。打开生成的build文件夹下的built.js,发现对刚刚新增加的两个样式做了兼容处理。
压缩css
复制上一节全部代码。在基础上进行修改。压缩css需要引入一个插件css-minimizer-webpack-plugin。终端输入命令npm i css-minimizer-webpack-plugin -D
进行下载(这是webpack5中的插件)。随后修改config.js配置
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin')
// 设置node.js环境变量,使其默认是处于开发环境development,不是生产环境
//压缩css的插件css-minimizer-webpack-plugin
process.env.NODE_ENV = 'development'
module.exports = {
entry: './js/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build'),
},
module: {
rules:
[
{
test: /\.css$/,
use:
[
// 创建style标签,将样式放入
// 'style-loader',所以想提取css成单独文件时,这里不能把css样式放入
// 使用下边的插件进行取代,提取js中的css成单独文件
MiniCssExtractPlugin.loader,
// 将css文件整合到js文件中
'css-loader',
//css兼容性处理: postcss --> 插件postcss-loader 、postcss-preset-env
//这些插件帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
//使用loader的默认配置
//"postcss-loader',
//修改loader的配置
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [require('postcss-preset-env')()]
}
}
}
]
}
]
},
plugins: [
new HtmlwebpackPlugin(
{
template: './index.html'
}
),
new MiniCssExtractPlugin(
{
// 对输出的文件重命名
filename: 'built.css'
}
),
new CssMinimizerWebpackPlugin(
{
// 压缩css的插件
}
)
]
}
终端输入npm run dev
。随后就可以查看build文件夹下的built.css文件的大小。
js语法检测
新建一个config.js文件用来写配置,以及入口文件index.js等等。
语法检测的意义:使代码的风格统一以及一些语法毛病的消除。需要下载一些包。eslint-webpack-plugin 、eslint。只检查自己写的源代码,第三方库不参与检查。设置的检查规则:在package.json中eslintConfig中设置,一个推荐的规则是airbnb,使用airbnb需要下载三个库,eslint-config-airbnb-base eslint eslint-plugin-import。
终端依次输入:
npm init
webpack_check
npm i webpack webpack-cli -D
npm i html-webpack-plugin -D
npm i eslint-webpack-plugin eslint eslint-config-airbnb-base eslint-plugin-import -D
然后在下载后的package.json中进行配置。
{
"name": "webpack_check",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack --mode development",
"build": "webpack --mode production"
},
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^8.5.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.25.3",
"eslint-webpack-plugin": "^3.1.1",
"webpack": "^5.65.0",
"webpack-cli": "^4.9.1"
},
"eslintConfig": {
"extends": "airbnb-base",
"env": {
"browser": true
}
}
}
congfig.js内进行修改代码
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const eslintwebpackplugin = require('eslint-webpack-plugin')
module.exports = {
entry: './src/js/index.js',
output: {
filename: 'js/built.js',
path: resolve(__dirname, 'build')
},
module: {
rules: [
/*语法检测的意义:使代码的风格统一以及一些语法毛病的消除。
需要下载一些包。eslint-webpack-plugin 、eslint。只检查自己写的源代码,第三方库不参与检查。
设置的检查规则:在package.json中eslintConfig中设置,一个推荐的规则是airbnb
使用airbnb需要下载三个库。eslint-config-airbnb-base eslint eslint-plugin-import
*/
// { webpack4中的写法
// test: /\.js$/,
// exclude: /node_modules/,
// loader: 'eslint-loader',
// options: {
// // 自动修复eslint的错误
// fix: true
// }
// }
]
},
plugins: [
new HtmlwebpackPlugin({
template: './src/index.html'
}),
new eslintwebpackplugin({
//使用默认设置
})
],
mode: 'development'
}
index.js代码
function add(x, y) {
return x + y;
}
console.log(add(2, 5));
index.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>heool</h1>
</body>
</html>
最后写好的工程文件目录
随后输入npm run dev
运行。
通过上图结果,我们可以看出检查的结果,首先问题文件为index.js,1:21表示第一行的第21个字符。那么自己一个个的修复很麻烦,所以在config.js中增加一个自动修复为true。
const { resolve } = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const eslintwebpackplugin = require('eslint-webpack-plugin')
module.exports = {
entry: './src/js/index.js',
output: {
filename: 'js/built.js',
path: resolve(__dirname, 'build')
},
module: {
rules: [
/*语法检测的意义:使代码的风格统一以及一些语法毛病的消除。
需要下载一些包。eslint-webpack-plugin 、eslint。只检查自己写的源代码,第三方库不参与检查。
设置的检查规则:在package.json中eslintConfig中设置,一个推荐的规则是airbnb
使用airbnb需要下载三个库。eslint-config-airbnb-base eslint eslint-plugin-import
*/
// { webpack4中的写法
// test: /\.js$/,
// exclude: /node_modules/,
// loader: 'eslint-loader',
// options: {
// // 自动修复eslint的错误
// fix: true
// }
// }
]
},
plugins: [
new HtmlwebpackPlugin({
template: './src/index.html'
}),
new eslintwebpackplugin({
// 使用默认设置,把自动修复改为true
fix: true
})
],
mode: 'development'
}
输入npm run dev
重新运行,发现红色的错误消失了,只有黄色的警告了,这就可以正常运行了。