npm i
style-loader 、css-loader、mini-css-extract-plugin、optimize-css-assets-webpack-plugin、html-webpack-plugin
"devDependencies": {
"webpack": "^4.29.6",
"webpack-cli": "^3.2.3",
"style-loader": "^0.23.1",
"css-loader": "^2.1.0",
"mini-css-extract-plugin": "^0.5.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"html-webpack-plugin": "^3.2.0"
}
const path = require("path");
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将 css 单独打包成文件
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin') // 压缩 css
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动引入文件 插件
module.exports = {
// webpack执行打包的唯一入口
entry: {
main: [path.resolve(__dirname, './src/main.js')],
},
// 打包的输入
output: {
// 将所有依赖的模块合并输出到main_xxxxxx.js,xxxxxx为随机生成的6位hash码
//当内容有改变时,hash会变化,防止缓存原因导致修改不更新
filename: 'js/[name]_[contenthash:6].js',
// 输出文件的存放路径, 必须是绝对路径
path: path.resolve(__dirname, "./dist")
},
// loader相关配置
module: {
rules: [{
test: /\.css$/, // 针对 .css 后缀的文件设置 loader
use: [
'style-loader',
{
loader: MiniCssExtractPlugin.loader
},
'css-loader'
]
}]
},
plugins: [
// 分割css
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
}),
// 压缩css
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.optimize\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', {
discardComments: {
removeAll: true
}
}],
},
canPrint: true
}),
// 自动生成html ( 于打包后 dist目录下的 双击在浏览器显示 )
new HtmlWebpackPlugin({
// 打包输出HTML
title: '自动生成 HTML',
minify: {
// 压缩 HTML 文件
removeComments: true, // 移除 HTML 中的注释
collapseWhitespace: true, // 删除空白符与换行符
minifyCSS: true // 压缩内联 css
},
filename: 'index.html', // 生成后的文件名
template: 'index.html', // 根据此模版生成 HTML 文件
// chunks: ['main'] // entry中的 app 入口才会被打包
}),
]
}
main.js
console.log("main");
import {age} from "./person"
console.log("age",age);
import "./css/main.css"
main.css
body {
background: yellow;
}
npm run dev
<!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>
<link rel="stylesheet" href="./dist/main.css">
</head>
<body>
<script src="./dist/js/main_451579.js"></script>
</body>
</html>
运行 npm run build 打包指令
在dist目录之中生成以下文件
"devDependencies": {
"node-sass": "^4.11.0",
"sass-loader": "^7.1.0",
}
$bgColor: red !default;
html {
p {
background-color: $bgColor;
}
.ppp {
display: flex;
justify-content: flex-end;
color: #fff;
}
}
与
为了 npm run dev ( 查看效果 )<!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>
<link rel="stylesheet" href="./dist/main.css">
</head>
<body>
<script src="./dist/js/main_efcf6d.js"></script>
<p class="ppp">
我是pppp
<span>1</span><span>2</span><span>3</span>
</p>
</body>
</html>
// loader相关配置
module: {
rules: [
// {
// test: /\.css$/, // 针对 .css 后缀的文件设置 loader
// use: [
// 'style-loader',
// {
// loader: MiniCssExtractPlugin.loader
// },
// 'css-loader'
// ]
// },
{
test: /\.(scss|css)$/, // 针对 .scss 或者 .css 后缀的文件设置 loader
use: [{
loader: MiniCssExtractPlugin.loader
},
'css-loader',
'sass-loader' // 使用 sass-loader 将 scss 转为 css
]
}
]
},
browserslist
{
"devDependencies": {
"css-loader": "^2.1.0",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.5.0",
"node-sass": "^4.11.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"postcss-loader": "^3.0.0",
"autoprefixer": "9.0.0",
"webpack": "^4.29.6",
"webpack-cli": "^3.2.3",
"clean-webpack-plugin": "^4.0.0"
},
"browserslist": [
"> 1%",
"last 2 version",
"not ie <= 8"
]
}
module.exports = {
plugins: [require('autoprefixer')]
}
const path = require("path");
module.exports = {
// webpack执行打包的唯一入口
entry: {
main: [path.resolve(__dirname, './src/main.js')],
},
// 打包的输入
output: {
// 将所有依赖的模块合并输出到main_xxxxxx.js,xxxxxx为随机生成的6位hash码
//当内容有改变时,hash会变化,防止缓存原因导致修改不更新
filename: 'js/[name]_[contenthash:6].js',
// 输出文件的存放路径, 必须是绝对路径
path: path.resolve(__dirname, "./dist")
},
// loader相关配置
module: {
rules: [
// {
// test: /\.css$/, // 针对 .css 后缀的文件设置 loader
// use: [
// 'style-loader',
// // MiniCssExtractPlugin.loader,
// {
// loader: MiniCssExtractPlugin.loader
// },
// 'css-loader'
// ]
// },
{
test: /\.(sa|sc|c)ss$/, // 针对 .sass .scss 或者 .css 后缀的文件设置 loader
use: [{
loader: MiniCssExtractPlugin.loader
},
'css-loader',
'postcss-loader', // 使用 postcss 为 css 加上浏览器前缀
'sass-loader' // 使用 sass-loader 将 scss 转为 css
]
}
]
},
plugins: [
]
}
<!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>
<link rel="stylesheet" href="./dist/main.css">
</head>
<body>
<script src="./dist/js/main_75bfc0.js"></script>
<p class="ppp">
我是pppp
<span>1</span><span>2</span><span>3</span>
</p>
</body>
</html>
"devDependencies": {
"glob-all": "^3.1.0",
"purify-css": "^1.2.5",
"purifycss-webpack": "^0.7.0"
},
$bgColor: red !default;
html {
p {
background-color: $bgColor;
}
.ppp {
display: flex;
justify-content: flex-end;
color: #fff;
font-size: 16px;
}
.box {
width: 100px;
height: 100px;
}
}
const path = require("path");
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将 css 单独打包成文件
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin') // 压缩 css
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动引入文件 插件
const {
CleanWebpackPlugin
} = require('clean-webpack-plugin') // 版本为2.0.0 不需要 { CleanWebpackPlugin } 结构! 大于2.0.0则需要
// 去掉 不加载的css
const PurifyCSS = require('purifycss-webpack')
const glob = require('glob-all')
module.exports = {
// webpack执行打包的唯一入口
entry: {
main: [path.resolve(__dirname, './src/main.js')],
},
// 打包的输入
output: {
// 将所有依赖的模块合并输出到main_xxxxxx.js,xxxxxx为随机生成的6位hash码
//当内容有改变时,hash会变化,防止缓存原因导致修改不更新
filename: 'js/[name]_[contenthash:6].js',
// 输出文件的存放路径, 必须是绝对路径
path: path.resolve(__dirname, "./dist")
},
// loader相关配置
module: {
rules: [
// {
// test: /\.css$/, // 针对 .css 后缀的文件设置 loader
// use: [
// 'style-loader',
// // MiniCssExtractPlugin.loader,
// {
// loader: MiniCssExtractPlugin.loader
// },
// 'css-loader'
// ]
// },
{
test: /\.(sa|sc|c)ss$/, // 针对 .sass .scss 或者 .css 后缀的文件设置 loader
use: [{
loader: MiniCssExtractPlugin.loader
},
'css-loader',
'postcss-loader', // 使用 postcss 为 css 加上浏览器前缀
'sass-loader' // 使用 sass-loader 将 scss 转为 css
]
}
]
},
plugins: [
//默认情况下,此插件删除 webpack output.path目录中的所有文件,以及每次成功重建后所有未使用的 webpack 资产
new CleanWebpackPlugin(),
// 分割css
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
}),
// 清除无用 css
new PurifyCSS({
paths: glob.sync([
// 要做 CSS Tree Shaking 的路径文件
path.resolve(__dirname, './*.html'), // 请注意,我们同样需要对 html 文件进行 tree shaking
path.resolve(__dirname, './src/*.js')
])
}),
// 压缩css
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.optimize\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', {
discardComments: {
removeAll: true
}
}],
},
canPrint: true
}),
// 自动生成html ( 于打包后 dist目录下的 双击在浏览器显示 )
new HtmlWebpackPlugin({
// 打包输出HTML
title: '自动生成 HTML',
minify: {
// 压缩 HTML 文件
removeComments: true, // 移除 HTML 中的注释
collapseWhitespace: true, // 删除空白符与换行符
minifyCSS: true // 压缩内联 css
},
filename: 'index.html', // 生成后的文件名
template: 'index.html', // 根据此模版生成 HTML 文件
// chunks: ['main'] // entry中的 app 入口才会被打包
}),
]
}