2.1 webpack究竟是什么
安装webpack
a.npm init
b.npm install webpack-cli --save-dev
npx webpack index.js 用webpack来执行index.js文件。
2.2
commonJS模块引入方式:
引入:var header=require('./header');
导出:module.exports=header;
ES Module模块引入方式:
引入:import Header from './header';
导出:export default Header; //header文件内部导出的方式
webpack只认识import这样的语法。
webpack核心定义是一个模块打包工具。
2.3 安装
- mkdir webpack-demo
- npm init
- npm install webpack webpack-cli //npm info webpack 查看webpack的所有版本号
2.4 使用webpack的配置文件
a. npx webpack --config webpackconfig.js 执行这个配置文件
b. 'dev': 'webpack' //npm run dev
c. 三种运行webpack的方式
全局安装 : webpack index.js
当前项目安装 : npx webpack index.js
npm scripts : npm run dev > webpack
- 默认配置 webpack.config.js
const path = require('path');
module.exports = {
mode:'production', //压缩模式 production / development
entry:'./src/index.js', //这样运行 npx webpack 会自动执行 index.js 文件。
output: {
filename: 'bundle.js',
path: path.resolve(__dirname,'bundle') //有path.resolve得到的是绝对路径,bundle为文件夹的名字
},
module:{
},
plugins:[
]
}
- webpack-cli 的作用,是让我们可以在命令行运行webpack 和 npx webpack
module: { //webpack默认知道怎么打包js,不知道怎么打包其他资源,所以需要配置打包规则
rules:[{
test:/\.(jpg|png|gif|jpeg)$/,
use:{
<!-- file-loader 将目标移动到dist目录下,将地址返回(loader就是一个打包方案) -->
<!-- loader:'file-loader', -->
<!-- url-loader 可以代替file-loader -->
loader:'url-loader',
options:{ //更多配置项
//placeholder 占位符
name:'[name]_[hash].[ext]', //ext是后缀
outputPath:'images/', //打包后文件位置
limit:10240, //图片大于10240字节时,不打包到js
}
}
},{
<!-- 怎么打包字体文件 -->
test:/\.(eot|ttf|svg)$/,
use:{
loader:'file-loader'
}
},{
test:/\.vue$/,
use:{
<!-- file-loader 将目标移动到dist目录下,将地址返回(loader就是一个打包方案) -->
loader:'vue-loader'
}
},{
test:/\.css$/,
<!-- css-loader 会分析出几个css直接的关系,生成一个css文件 -->
<!-- style-loader 将css-loader生成的css文件,挂载到header部分-->
use:['style-loader','css-loader']
},{
test:/\.scss$/,
<!-- 使用sass-loader 需要安装 node-sass 和 sass-loader -->
<!-- postcss-loader 自动添加浏览器厂商前缀,比如-webkit- -->
use:['style-loader','css-loader','sass-loader','postcss-loader']
},{
test:/\.scss$/,
use:[
'style-loader',
{
loader:'css-loader',
options:{
importLoaders:2, //对于scss文件里引入的scss文件,也会先执行postcss-loader和sass-loader
<!-- img.classList.add(style.avatar) 应用style文件里的.avatar样式-->
modules:true //true时,可以使用注释里的语法,不会和其他模块的css样式耦合
}
}
'sass-loader',
'postcss-loader'
]
}]
}
## 新建文件postcss.config.js,用来给浏览器做兼容,自动添加css前缀
module.exports = {
plugins: [
require('autoprefixer')
]
}
## plugin 可以在webpack运行到某个时刻的时候,帮你做一些事情
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
plugins:[
<!-- 会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中 -->
new HtmlWebpackPlugin({
template:'src/index.html'
}),
<!-- 打包前移除目录 -->
new CleanWebpackPlugin(['dist'],{
root:path.resolve(__dirname,'../')
})
]
## entry 和 output 的基本配置
entry: {
main: './src/index.js',
sub: './src/index.js'
},
output: {
publicPath:'http://cdn.com.cn', //在打包后的文件路径前加上
filename:'[name].js',
path:path.resolve(__dirname,'dist')
}
## SourceMap 的基本配置
sourceMap 它是一个映射关系,他知道dist目录下的main.js文件96行实际上对应src目录下index.js文件的第一行。
module.exports = {
mode:'development',
devtool:'cheap-module-eval-source-map' // 做源代码和目标生成代码之间的一个映射
mode:'production',
devtool:'cheap-module-source-map' //方便调试代码
}
source-map / cheap-inline-source-map 只提示错误行,不提示第几个字符
## webpack-dev-server
devServer: {
contentBase: './dist',
open:true,
port:8080,
hot:true,
hotOnly:true,
proxy:{
'/api':'http://localhost:3000'
}
}
"scripts": {
"start":"webpack-dev-server"
}
## hot module replacement : 当CSS样式改变的时候,不会刷新页面,而是直接应用样式
const webpack = require('webpack');
devServer: {
contentBase: './dist', // 在哪个目录下启动服务器
open:true,
port:8080,
hot:true,
hotOnly:true,
}
plugins: {
new webpack.HotModuleReplacementPlugin();
}
## 使用 babel 处理es6语法
安装 babel-loader @babel/core
babel-loader 只是js和webpack之间的桥梁,并不会转码,真正将es6转为es5的是 @bebal/preset-env
@babel/polyfill 给低版本浏览器补充高版本语法
安装 @babel/plugin-transform-runtime @babel/runtime
# 以下处理业务代码可以
module:{
rules:[{
test:/\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options:{
presets:[['@babel/preset-env',{
useBuiltIns: 'usage' //只把用到的es6语法转es5,设置这个就不用引@babel/polyfill(已内置)
}]]
}
}]
}
或者
{
presets:[
[
"@babel/preset-env",{
targets:{
chrome:"67",
},
useBuiltIns:"usage"
}
]
]
}
# 以下处理插件或者UI库,新建 .babelrc 文件
{
"plugins":[[
"@babel/plugin-transform-runtime",{
"corejs":2, //一定是2,要安装 core 插件
"helpers":true,
"regenerator":true,
"useESModules":false
}
]]
}
# Tree Shaking 只打包用到的东西,如果有些方法没用到,则不会打包进去。
1.plugins:[ //在生产环境,不需要此配置
optimization:{
usedExports:true
}
]
2.package.json文件,添加如下代码:
"sideEffects":false; 所有文件都做tree shaking
"sideEffects":[
*.css //对css文件不做tree shaking
]
# Development 和 Production 模式
const merge = require("webpack-merge");
module.exports = merge(baseConfig, devConfig);
# webpack 和 code splitting
import _ from lodash;
plugins:[
],
optimization:{
splitChunks:{
chunks:'all' // 自动把公用代码分割成单独文件。
}
}
# MiniCssExtractPlugin 提取css文件,在生产环境启用。用来代替extract-text-webpack-plugin
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
rules:[
{
test:/\.css$/,
use:[
MiniCssExtractPlugin.loader,
'css-loader'
]
}
]
plugins:[
new MiniCssExtractPlugin({
filename:'./css/[name].css'
})
]
## 提取公共部分 CommonsChunkPlugin 在4.0被弃用。
optimization: {
splitChunks: {
cacheGroups: {
commons: {
name: 'commons', //提取出来的文件命名
test:/\.css$/,
chunks: 'initial', //initial表示提取入口文件的公共部分
minChunks: 2, //表示提取公共部分最少的文件数
minSize: 0 //表示提取公共部分最小的大小
}
}
}
}
## optimize-css-assets-webpack-plugin用于压缩css文件
optimization:{
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g, //一个正则表达式,指示应优化/最小化的资产的名称。提供的正则表达式针对配置中ExtractTextPlugin实例导出的文件的文件名运行,而不是源CSS文件的文件名。默认为/\.css$/g
cssProcessor: require('cssnano'), //用于优化\最小化CSS的CSS处理器,默认为cssnano
cssProcessorOptions: { safe: true, discardComments: { removeAll: true } }, //传递给cssProcessor的选项,默认为{}
canPrint: true //一个布尔值,指示插件是否可以将消息打印到控制台,默认为true
})
}
## 环境变量
方法一:"build":"webpack --env.production
方法二:"build":"webpack --env production
module.exports=(evn) => {
if(env && env.production){
}
}
打包一个库的设置:
module.exports = {
mode:'production',
externals:['lodash'],
entry:'./src/index.js',
output:{
path:path.resolve(__dirname,'dist'),
filename:'library.js',
library:'root', //挂载全局变量
libraryTarget:'umd' //这样可以用common的方式引用。
}
}
网友评论