npm init
npm webpack_test
npm i webpack webpack-cli -g//全局安装
npm i webpack webpack-cli -D//本地安装
开发环境
webpack ./src/index.js -o ./built/bulit.js --mode=deveopment
./src/index.js 入口文件
打包后输出到./built.js
不能处理css,img资源,能处理js,json资源
生产环境和开发环境相比将ES6模块化编译成浏览器能认识的模块
生产环境会比开发环境多一个压缩js代码
- devserver包
npm i webpack-dev-server
npx webpack serve 启动指令
const {resolve}=require('path')
const HtmlWebpackPlugin=require('html-webpack-plugin')
module.exports={
entry:'./src/js/index.js',
output:{
filename:'js/bulit.js',
path:resolve(__dirname,'bulid')
},
module:{
rules:[
{
test:/\.css$/,
use:[
'style-loader',
'css-loader'
]
},
{
test:/\.less$/,
use:[
'style-loader',
'css-loader',
'less-loader'
]
},
{
//处理不了html的img图片
test:/\.jpg|png|gif$/,
//下载url-loader file-loder
loader:'url-loader',
options:{
//图片大小小于8kb就会被base64处理
//优点减少请求数量(减轻服务器压力)
//缺点图片体积会更大(文件请求会更慢)
limit:8*1024,
//关闭es6使用commonjs
esModule:false,
//取文件原来扩展名
name:'[hash:10].[ext]',
outputPath:'img'
}
},
{
//处理html的img图片
test:/\.html$/,
//下载url-loader file-loder
loader:'html-loader',
options:{
esModule:false
}
},
{
//打包其他资源
exclude:/\.(css|html|js|jpg|png|gif|less|josn)/,
loader:'file-loader',
options:{
name:'[hash:10].[ext]',
outputPath:'media'
}
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
})
],
//开发服务器devserver:用来自动化
//特点只会在内存中编译打包,不会有任何输出
//指令npx webpack serve
mode:'development',
devServer:{
//项目构建后的路径
contentBase:resolve(__dirname,'bulid'),
//启动gzip压缩
compress:true,
port:3000,
open:true
}
}
生产环境配置
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { loader } = require("mini-css-extract-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin");
poscess.env.NODE_ENV = 'production';
const { resolve } = require("path");
const commonCssLoader = [
//提取成单独文件
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions:{
ident:'postcss',
plugins:[
require('postcss-preset-env')()
]
}
}
}
]
module.exports = {
entry: './src/js/index.js',
output: {
filename: 'js/bulit.js',
path: resolve(__dirname, 'bulid')
},
module: {
rules: [
//css
{
test: /\.css$/,
use: [
...commonCssLoader
]
},
//less
{
test: /\.less$/,
use: [
...commonCssLoader,
'less-loader'
]
},
//js
{
test:/\.js$/,
exclude:/node_modules/,
//优先执行
enforce:'pre',
loader:'eslint-loader',
options:{
fix:true
}
},
//js兼容性问题解决
{
test:/\.js$/,
exclude:/node_modules/,
loader:'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'entry',
corejs: {
version: 3
},
targets: {
chrome: '60',
firefox: "60",
ie: '9',
safari: '10',
edge: '17'
}
}
]
],
//利用 @babel/plugin-transform-runtime 插件还能以沙箱垫片的方式防止污染全局, 并抽离公共的 helper function , 以节省代码的冗余
"plugins": ["@babel/plugin-transform-runtime"]
}
},
//img
{
test:/\.jpg|png|gif$/,
loader:'url-loader',
options:{
limit:8*1024,
//关闭es6使用commonjs
esModule:false,
name:'[hash:10].[ext]'
}
},
//html
{
test:/\.html$/,
loader:'html-loader',
options:{
esModule:false
}
},
//打包其他资源
{
exclude:/\.(css|html|js|jpg|png|gif)/,
loader:'file-loader',
options:{
outputPath:'media',
name:'[hash:10].[ext]'
}
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/bulit.css'
}),
new OptimizeCssAssetsPlugin(),
new HtmlWebpackPlugin({
template:'./src/index.html',
minify:{
//移除空格
collapseWhitespace:true,
//移除注释
removeComments:true
}
})
],
mode: 'production'
}
开发环境性能优化
const {resolve}=require('path')
const HtmlWebpackPlugin=require('html-webpack-plugin')
//HMR:hot module replacement 热模块替换/模块热替换
//作用:当一个模块发生变化,只会重新打包这一个模块html不用做HMR
//解决:entry入口将html文件引入
module.exports={
entry:['./src/js/index.js','./src/index.html'],
output:{
filename:'js/bulit.js',
path:resolve(__dirname,'bulid')
},
target:'web',
module:{
rules:[
{
test:/\.css$/,
use:[
'style-loader',
'css-loader'
]
},
{
test:/\.less$/,
use:[
'style-loader',
'css-loader',
'less-loader'
]
},
{
//处理不了html的img图片
test:/\.jpg|png|gif$/,
//下载url-loader file-loder
loader:'url-loader',
options:{
//图片大小小于8kb就会被base64处理
//优点减少请求数量(减轻服务器压力)
//缺点图片体积会更大(文件请求会更慢)
limit:8*1024,
//关闭es6使用commonjs
esModule:false,
//取文件原来扩展名
name:'[hash:10].[ext]',
outputPath:'img'
}
},
{
//处理html的img图片
test:/\.html$/,
//下载url-loader file-loder
loader:'html-loader',
options:{
esModule:false
}
},
{
//打包其他资源
exclude:/\.(css|html|js|jpg|png|gif|less|josn)/,
loader:'file-loader',
options:{
name:'[hash:10].[ext]',
outputPath:'media'
}
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
})
],
//开发服务器devserver:用来自动化
//特点只会在内存中编译打包,不会有任何输出
//指令npx webpack serve
mode:'development',
devServer:{
//项目构建后的路径
contentBase:resolve(__dirname,'bulid'),
//启动gzip压缩
compress:true,
port:3000,
open:true,
//开启HMR功能
hot:true
}
}
生产环境优化
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin");
poscess.env.NODE_ENV = 'production';
const { resolve } = require("path");
const commonCssLoader = [
//提取成单独文件
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions:{
ident:'postcss',
plugins:[
require('postcss-preset-env')()
]
}
}
}
]
module.exports = {
entry: './src/js/index.js',
output: {
filename: 'js/bulit.js',
path: resolve(__dirname, 'bulid')
},
module: {
rules: [
//css
{
test:/\.js$/,
exclude:/node_modules/,
//优先执行
enforce:'pre',
loader:'eslint-loader',
options:{
fix:true
}
},
{
//以下loader只会匹配一个
//不能有两个配置处理同一钟类型的文件
oneOf:[
{
test: /\.css$/,
use: [
...commonCssLoader
]
},
//less
{
test: /\.less$/,
use: [
...commonCssLoader,
'less-loader'
]
},
//js
//js兼容性问题解决
{
test:/\.js$/,
exclude:/node_modules/,
loader:'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'entry',
corejs: {
version: 3
},
targets: {
chrome: '60',
firefox: "60",
ie: '9',
safari: '10',
edge: '17'
}
}
]
],
//利用 @babel/plugin-transform-runtime 插件还能以沙箱垫片的方式防止污染全局, 并抽离公共的 helper function , 以节省代码的冗余
"plugins": ["@babel/plugin-transform-runtime"]
}
},
//img
{
test:/\.jpg|png|gif$/,
loader:'url-loader',
options:{
limit:8*1024,
//关闭es6使用commonjs
esModule:false,
name:'[hash:10].[ext]'
}
},
//html
{
test:/\.html$/,
loader:'html-loader',
options:{
esModule:false
}
},
//打包其他资源
{
exclude:/\.(css|html|js|jpg|png|gif)/,
loader:'file-loader',
options:{
outputPath:'media',
name:'[hash:10].[ext]'
}
}
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/bulit.css'
}),
new OptimizeCssAssetsPlugin(),
new HtmlWebpackPlugin({
template:'./src/index.html',
minify:{
//移除空格
collapseWhitespace:true,
//移除注释
removeComments:true
}
})
],
mode: 'production'
}