1.webpack
项目-----》装载器------》插件------》浏览器
loader:将浏览器不能识别的文件转化为html,js,css
插件:对文件进行处理像压缩,合并等
入口:
出口:
创建webpack
webpack init -y
webpack零配置打包
npx webpack
只打包js文件生成main.js
webpack指定配置
默认入口: src/index.js
默认出口: dist/main.js
插件
html-webpack-plugin:
plugins:[
new htmlWebpackPlugin({
template:'./src/index.html',//指定输出得文件模板
filename:'main.html'//指定输出的文件名
})
]
webpack-dev-server:
配置:
"scripts": {
"dev":"webpack serve",
"test": "echo \"Error: no test specified\" && exit 1"
},
在webpack.config.js中配置
使用命令 npm run dev
webpack默认只支持js,不支持css
需要css-loader
style-loader: 将css直接添加到html的script标签中
装载器的执行顺序从右到左
module:{
rules:[
{
test:/\.css/,
use:['style-loader','css-loader']
}
]
}
加载多个css文件在index.css中可以导入别的样式文件也能打包
@import './color.css';
body{
background: red;
}
less-loader
{
test:/\.less/,
use:['style-loader','css-loader','less-loader']
}
@import './color.css';
@import './index.less';
body{
background: red;
}
抽取css作为一个文件 css文件抽取器
插件: mini-css-extract-plugin
使用:
const cssMiniExtractPlugin = require('mini-css-extract-plugin')
plugins:[
new htmlWebpackPlugin({
template:'./src/index.html',//指定输出得文件模板
filename:'index.html'//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
}),
new cssMiniExtractPlugin({
filename:'index.css'
})
],
module:{
rules:[
{
test:/\.css/,
// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
use:[cssMiniExtractPlugin.loader,'css-loader']
},
{
test:/\.less/,
use:[cssMiniExtractPlugin.loader,'css-loader','less-loader']
}
]
}
mode改为production,打包的时候会把js压缩,css没有被压缩
css压缩插件 optimize-css-assets-webpack-plugin CssMinimizerWebpackPlugin
css-minimizer-webpack-plugin插件更新使用方法相同
使用:const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
optimization:{
minimizer:[new OptCssAssetsWebpackPlugin()]
},
配置了css压缩后js压缩会失效,需要指定js压缩插件
terser-webpack-plugin
配置:
optimization:{
minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]
},
webpack5支持部分es6,不支持es7
babel是一个javascript编译器
使用装载器 babel-loader
安装插件:npm install -D babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-decorators --legacy-peer-deps
配置:{
test:/\.js$/,
use:{
loader:'babel-loader',
options:{
presets:[
"@babel/preset-env"
],
}
}
}
js模块化:
commonjs :
a.js
let c = 'a'
module.exports = {
c
}
加载:
let c = require('./a.js');
es6导出
a.js
const a = 444
export default a
加载
import a from './a.js'
tree shaking 树摇 在生产模式中启用
将没有使用的代码在打包中去掉(去掉不用的代码)
webpack4的这个功能很弱,只支持当前js中午用的代码删除
webpack5加强了这个功能
打包生成dist目录没有分类存储
打包生成动态名字和hash
filename:'css/[name].[hash].css'
filename:'css/[name].[hash:4].css' 4位hash值
第一次打包文件会被浏览器自动缓存,当第二次修改打包发布文件不变,文件不会下载新的文件
hash:内容hash,内容有改变hash值就会改变
全局变量 jquery
全局变量使用import导入就需要每个地方都需要导入
配置全局变量
const webpack = require('webpack')
webpack.providePlugin 能够给所有组件注入全局变量
new webpack.ProvidePlugin({
$:'jquery'
})
这样问题是会把jquery三方包一起打包,会造成打包的文件很大
将别的包使用cdn链接引入项目
externals:{
jquery:'$'
}
图片加载 file-loader
file-loader默认使用的是es6的模块化
{
test:/\.(jpg|png|webp)$/,
use:[{
loader:'file-loader',
options: {
esModule:false,//默认使用es6的模块化,false是commonjs模块化
name: '[name].[ext]',
outputPath: 'images/'
}
}],
},
1.使用js导入
2.css导入
{
test:/\.css$/,
// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
use:[{
loader: cssMiniExtractPlugin.loader,
options: {
publicPath:'../'
}
},'css-loader']
},
3.html使用图片
插件 html-withimg-loader
配置: {
test:/\.html$/,
use:['html-withimg-loader']
},
url-loader使用方法和file-loader相同,只是url-loader可以设置limit属性在图片小于这个限制可以转化为base64
样式兼容性
chrome:webkit
等到所有厂商都支持后可以去掉前缀
安装插件: yarn add -D autoprefixer postcss-loader --legacy-peer-deps
使用创建配置文件:postcss.config.js
module.exports = {
plugins:[
require('autoprefixer')
]
}
在package.json中添加
"browserslist":[
"> 1%",
"last 100 version",
"not ie<=8"
]
配置postcss-loader
{
test:/\.css$/,
// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
use:[{
loader: cssMiniExtractPlugin.loader,
options: {
publicPath:'../'
}
},'css-loader',,'postcss-loader']
},
单页面应用:页面都是动态生成,标签数据 单个html
多页面应用: 大型应用 静态化 多个html、
webpack多环境打包
各个环境服务器ip不同
.env 配置文件
模板模式:首先要有一个模板,这个模板会实现大部分功能,只留下部分未实现,子文件继承模板,自己扩展 最终得到一个子和父的合体
根究不同的环境配置
webpack.base.js 模板
webpack.dev.js 开发环境
webpack.prod.js 生产环境
多种跨域支持:
1.cors:后端处理
2.代理 nginx
3.webpack处理跨域
webpack代理 只能在开发中使用
devServer:{//w=配置webpack-dev-server
port:"8080",//配置端口
open:true,//自动打开浏览器
// progress:true,//显示进度
// contentBase:'./dist'//指定web服务器的根目录默认是dist
proxy:{
'/api':{
target:'http://...',
// pathRewrite:{
// '/api':''//去掉前缀/api
// }
}
}
},
4.将后端服务与前端服务整合到一块
const webpack = require('webpack');
const middle = require("webpack-dev-middleware");
const config = require('./webpack.config");
const compile = webpack(config);
app.use(middle(compile))
5.jsonp
热更新(热加载)
devServer:{//w=配置webpack-dev-server
port:"8080",//配置端口
open:true,//自动打开浏览器
hot:true,//开启热更新
// progress:true,//显示进度
// contentBase:'./dist'//指定web服务器的根目录默认是dist
proxy:{
'/api':{
target:'http://...',
// pathRewrite:{
// '/api':''//去掉前缀/api
// }
}
}
},
单页面应用配置
const path = require('path');
let htmlWebpackPlugin = require('html-webpack-plugin');
const cssMiniExtractPlugin = require('mini-css-extract-plugin');
// const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
const OptCssAssetsWebpackPlugin =require('css-minimizer-webpack-plugin')
const terserWebpackPlugin = require('terser-webpack-plugin')
const webpack = require('webpack')
// node写法,webpack基于node
module.exports = {
mode:'production',//production、development
// 入口
entry:'./src/index.js',
output:{
path:path.resolve(__dirname,"dist"),
filename:'js/[name].[hash].js'
},
devServer:{//w=配置webpack-dev-server
port:"8080",//配置端口
open:true,//自动打开浏览器
// progress:true,//显示进度
// contentBase:'./dist'//指定web服务器的根目录默认是dist
},
optimization:{
minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]
},
plugins:[
new htmlWebpackPlugin({
template:'./src/index.html',//指定输出得文件模板
filename:'index.html'//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
}),
new cssMiniExtractPlugin({
filename:'css/[name].[hash].css'
}),
new webpack.ProvidePlugin({
$:'jquery'
})
],
module:{
rules:[
{
test:/\.css$/,
// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
use:[{
loader: cssMiniExtractPlugin.loader,
options: {
publicPath:'../'
}
},'css-loader',,'postcss-loader']
},
{
test:/\.less$/,
use:[cssMiniExtractPlugin.loader,'css-loader','less-loader','postcss-loader']
},
// {
// test:/\.(jpg|png|webp)$/,
// use:[{
// loader:'file-loader',
// options: {
// esModule:false,//默认使用es6的模块化,false是commonjs模块化
// name: '[name].[ext]',
// outputPath: 'images/'
// }
// }],
// },
{
test:/\.(jpg|png|webp)$/,
use:[{
loader:'url-loader',
options: {
esModule:false,//默认使用es6的模块化,false是commonjs模块化
name: '[name].[ext]',
outputPath: 'images/',
limit:100*1024
}
}],
},
{
test:/\.html$/,
use:['html-withimg-loader']
},
{
test:/\.js$/,
use:{
loader:'babel-loader',
options:{
presets:[
"@babel/preset-env"
],
}
}
}
]
},
//排除不需要的第三方包
externals:{
jquery:'$'
}
}
多页面应用:
// 多页面应用打包需要指定多个入口多个出口
const path = require('path');
let htmlWebpackPlugin = require('html-webpack-plugin');
const cssMiniExtractPlugin = require('mini-css-extract-plugin');
// const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
const OptCssAssetsWebpackPlugin =require('css-minimizer-webpack-plugin')
const terserWebpackPlugin = require('terser-webpack-plugin')
const webpack = require('webpack')
// node写法,webpack基于node
module.exports = {
mode:'production',//production、development
// 入口多页面应用
entry:{
index:'./src/index.js',
other:'./src/other.js'
},
output:{
path:path.resolve(__dirname,"dist"),
filename:'js/[name].[hash].js'//多个入口就输出多个文件
},
devServer:{//w=配置webpack-dev-server
port:"8080",//配置端口
open:true,//自动打开浏览器
hot:true,//开启热更新
// progress:true,//显示进度
// contentBase:'./dist'//指定web服务器的根目录默认是dist
proxy:{
'/api':{
target:'http://...',
// pathRewrite:{
// '/api':''//去掉前缀/api
// }
}
}
},
optimization:{
minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]
},
plugins:[
// 输出主页 引入的js也不一样
new htmlWebpackPlugin({
template:'./src/index.html',//指定输出得文件模板
filename:'index.html',//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
chunks:['index']
}),
// 输出别的页面
new htmlWebpackPlugin({
template:'./src/index.html',//指定输出得文件模板
filename:'other.html',//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
chunks:['index','other']
}),
new cssMiniExtractPlugin({
filename:'css/[name].[hash].css'
}),
new webpack.ProvidePlugin({
$:'jquery'
})
],
module:{
rules:[
{
test:/\.css$/,
// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
use:[{
loader: cssMiniExtractPlugin.loader,
options: {
publicPath:'../'
}
},'css-loader',,'postcss-loader']
},
{
test:/\.less$/,
use:[cssMiniExtractPlugin.loader,'css-loader','less-loader','postcss-loader']
},
// {
// test:/\.(jpg|png|webp)$/,
// use:[{
// loader:'file-loader',
// options: {
// esModule:false,//默认使用es6的模块化,false是commonjs模块化
// name: '[name].[ext]',
// outputPath: 'images/'
// }
// }],
// },
{
test:/\.(jpg|png|webp)$/,
use:[{
loader:'url-loader',
options: {
esModule:false,//默认使用es6的模块化,false是commonjs模块化
name: '[name].[ext]',
outputPath: 'images/',
limit:100*1024
}
}],
},
{
test:/\.html$/,
use:['html-withimg-loader']
},
{
test:/\.js$/,
use:{
loader:'babel-loader',
options:{
presets:[
"@babel/preset-env"
],
}
}
}
]
},
//排除不需要的第三方包
externals:{
jquery:'$'
}
}