const path = require('path')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry:'./src/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname,'dist'),// 输出文件名filename: '[name].js'},module: {rules:[// 详细loader配置【// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']}]},plugins: [// 详细plugins的配置]}
打包html资源
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry:'./src/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname,'dist'),// 输出文件名filename: 'built.js'},module: {rules:[// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'})]}
打包图片资源
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname, 'dist'),// 输出文件名filename: 'built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'})]}
打包字体资源
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname, 'dist'),// 输出文件名filename: 'built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'})]}
devServer
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { resolve } = require('path')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname, 'dist'),// 输出文件名filename: 'built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'})],// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)// 特点:只会在内存中编译打包,不会有任何输出// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后的路径contentBase: resolve(__dirname,'build'),// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true}}
开发环境配置
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { resolve } = require('path')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/js/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: path.resolve(__dirname, 'dist'),// 输出文件名filename: 'js/built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效'style-loader',// 将css文件变成commonjs模块 加载js中,里面的内容是样式字符串'css-loader']},{test: /\.less$/,use: ['style-loader','css-loader',// 将less文件编译成 css文件'less-loader']},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]',outputPath: 'imgs'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]',outputPath: 'media'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'})],// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)// 特点:只会在内存中编译打包,不会有任何输出// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后的路径contentBase: resolve(__dirname,'build'),// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true}}
构建环境

开发模式一般追求快
生产模式需要做一些优化:代码压缩、兼容性处理、稳定性…
提取css成单独文件
需要下载 min-css-extract-plugin
npm i min-css-extract-plugin -D
这里要设置publicPath,不然 css 的背景图片无法显示
module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.(css|less)$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效// 'style-loader',// 这个loader取代style-loader 作用:提取js中的css成单独文件{loader: MiniCssExtractPlugin.loader,options: {// 设置背景图片的路径publicPath: '../'}},// 将css文件整合到js文件中'css-loader','less-loader',],}]}
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const HtmlWebpackPlugin = require('html-webpack-plugin')const { resolve } = require('path')const MiniCssExtractPlugin = require('mini-css-extract-plugin')module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/js/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: resolve(__dirname, 'dist'),// 输出文件名filename: 'js/built.js',},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.(css|less)$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效// 'style-loader',// 这个loader取代style-loader 作用:提取js中的css成单独文件{loader: MiniCssExtractPlugin.loader,options: {// 设置背景图片的路径publicPath: '../'}},// 将css文件整合到js文件中'css-loader','less-loader',],},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]',outputPath: 'imgs'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]',outputPath: 'media'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'}),new MiniCssExtractPlugin({// 对输出的css文件进行重命名filename: 'css/built.css'})],// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)// 特点:只会在内存中编译打包,不会有任何输出// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后的路径contentBase: resolve(__dirname, 'build'),// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true}}
css兼容性处理
css浏览器兼容性处理:
postcss —> postcss-loader postcss-preset-env
帮postcss找到package.json中 browserslist 里面的配置,通过配置加载指定的css兼容性样式
npm i postcss-loader@3.0.0 postcss-preset-env@6.7.0 -D
package.json中 的配置
"browserslist": {"development":[# 最近一版的chorme"last 1 chrome version","last 1 firefox version","last 1 safari version"],"production":[# 99.8% 的浏览器 没有死掉的 没有欧朋">0.2%","not dead","not op_mini all"]}
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const HtmlWebpackPlugin = require('html-webpack-plugin')const { resolve } = require('path')const MiniCssExtractPlugin = require('mini-css-extract-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = 'development'module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/js/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: resolve(__dirname, 'dist'),// 输出文件名filename: 'js/built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.(css|less)$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效// 'style-loader',// 这个loader取代style-loader 作用:提取js中的css成单独文件{loader: MiniCssExtractPlugin.loader,options: {// 设置背景图片的路径publicPath: '../'}},// 将css文件整合到js文件中'css-loader','less-loader',/*css兼容性处理:postcss --> postcss-loader postcss-preset-env帮postcss找到package.json中 browserslist 里面的配置,通过配置加载指定的css兼容性样式"browserslist": {开发环境:需要设置环境变量 process.env.NODE_ENV = development"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"],生产环境:默认就是生产环境"production":[">0.2%","not dead","not op_mini all"]}*/{loader: 'postcss-loader',options: {ident: 'postcss',plugins: () => {// postcss的插件require('postcss-preset-env')()}}}// 使用loader的默认配置// 'postcss-loader',// 修改loader的配置]},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]',outputPath: 'imgs'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]',outputPath: 'media'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'}),new MiniCssExtractPlugin({// 对输出的css文件进行重命名filename: 'css/built.css'})],// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)// 特点:只会在内存中编译打包,不会有任何输出// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后的路径contentBase: resolve(__dirname, 'build'),// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true}}
更多浏览器的配置可以在 github 搜索 browserslist
压缩css
需要下载插件 optimize-css-assets-webpack-plugin
/*loader: 1.下载 2.使用plugins: 1.下载 2.引用 3.使用*/const HtmlWebpackPlugin = require('html-webpack-plugin')const { resolve } = require('path')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = 'development'module.exports = {// 模式 development productionmode: 'development',// 入口起点entry: './src/js/index.js',// 输出output: {// 输出路径// __dirname nodejs的变量, 代表当前文件的目录绝对路径path: resolve(__dirname, 'dist'),// 输出文件名filename: 'js/built.js'},module: {rules: [// 详细loader配置// 不同文件必须配置不同loader{// 匹配哪些文件test: /\.(css|less)$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style 标签,将js中的样式资源进行插入,添加到head中生效// 'style-loader',// 这个loader取代style-loader 作用:提取js中的css成单独文件{loader: MiniCssExtractPlugin.loader,options: {// 设置背景图片的路径publicPath: '../'}},// 将css文件整合到js文件中'css-loader','less-loader',/*css兼容性处理:postcss --> postcss-loader postcss-preset-env帮postcss找到package.json中 browserslist 里面的配置,通过配置加载指定的css兼容性样式"browserslist": {开发环境:需要设置环境变量 process.env.NODE_ENV = development"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"],生产环境:默认就是生产环境"production":[">0.2%","not dead","not op_mini all"]}*/{loader: 'postcss-loader',options: {ident: 'postcss',plugins: () => {// postcss的插件require('postcss-preset-env')()}}}// 使用loader的默认配置// 'postcss-loader',// 修改loader的配置]},{// 问题: 默认处理不了html中img图片// 处理图片资源test: /\.(jpg|png|jpeg|gif)$/,// 下载url-loader file-loader (url-loader依赖于file-loader)loader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,// 优点:减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)limit: 8 * 1024,// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs// 解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,// 给图片进行重命名// [hash:10]取图片的hash的前10位// [ext]取文件原来扩展名name: '[hash:10].[ext]',outputPath: 'imgs'}},{test: /\.html$/,// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader'},// 打包其他资源{// 排除css/js/html资源exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,loader: 'file-loader',options: {name: '[hash:10].[ext]',outputPath: 'media'}}]},plugins: [// 详细plugins的配置// HtmlWebpackPlugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html'}),new MiniCssExtractPlugin({// 对输出的css文件进行重命名filename: 'css/built.css'}),// 压缩cssnew OptimizeCssAssetsWebpackPlugin()],// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)// 特点:只会在内存中编译打包,不会有任何输出// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后的路径contentBase: resolve(__dirname, 'build'),// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true}}
语法检查
arbnb可以去github搜一下
/*
loader: 1.下载 2.使用
plugins: 1.下载 2.引用 3.使用
*/
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { resolve } = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
// 设置nodejs环境变量
// process.env.NODE_ENV = 'development'
module.exports = {
// 模式 development production
mode: 'development',
// 入口起点
entry: './src/js/index.js',
// 输出
output: {
// 输出路径
// __dirname nodejs的变量, 代表当前文件的目录绝对路径
path: resolve(__dirname, 'dist'),
// 输出文件名
filename: 'js/built.js'
},
module: {
rules: [
// 详细loader配置
// 不同文件必须配置不同loader
{
// 匹配哪些文件
test: /\.(css|less)$/,
// 使用哪些loader进行处理
use: [
// use数组中loader执行顺序:从右到左,从下到上 依次执行
// 创建style 标签,将js中的样式资源进行插入,添加到head中生效
// 'style-loader',
// 这个loader取代style-loader 作用:提取js中的css成单独文件
{
loader: MiniCssExtractPlugin.loader,
options: {
// 设置背景图片的路径
publicPath: '../'
}
},
// 将css文件整合到js文件中
'css-loader',
'less-loader',
/*
css兼容性处理:
postcss --> postcss-loader postcss-preset-env
帮postcss找到package.json中 browserslist 里面的配置,通过配置加载指定的css兼容性样式
"browserslist": {
开发环境:需要设置环境变量 process.env.NODE_ENV = development
"development":[
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
],
生产环境:默认就是生产环境
"production":[
">0.2%",
"not dead",
"not op_mini all"
]
}
*/
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => {
// postcss的插件
require('postcss-preset-env')()
}
}
}
// 使用loader的默认配置
// 'postcss-loader',
// 修改loader的配置
]
},
{
// 问题: 默认处理不了html中img图片
// 处理图片资源
test: /\.(jpg|png|jpeg|gif)$/,
// 下载url-loader file-loader (url-loader依赖于file-loader)
loader: 'url-loader',
options: {
// 图片大小小于8kb,就会被base64处理,
// 优点:减少请求数量(减轻服务器压力)
// 缺点:图片体积会更大(文件请求速度更慢)
limit: 8 * 1024,
// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入是commonjs
// 解析时会出问题:[object Module]
// 解决:关闭url-loader的es6模块化,使用commonjs解析
esModule: false,
// 给图片进行重命名
// [hash:10]取图片的hash的前10位
// [ext]取文件原来扩展名
name: '[hash:10].[ext]',
outputPath: 'imgs'
}
},
{
test: /\.html$/,
// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
loader: 'html-loader'
},
// 打包其他资源
{
// 排除css/js/html资源
exclude: /\.(css|js|html|less|jpg|png|jpeg|gif)/,
loader: 'file-loader',
options: {
name: '[hash:10].[ext]',
outputPath: 'media'
}
},
/*
语法检查:eslint-loader eslint
注意: 只检查自己写的源代码,第三方库是不用检查的
设置检查规则:
package.json中eslintConfig中设置
"eslintConfig": {
"extends": "airbnb-base"
}
airbnb --> eslint-config-airbnb-base eslint-plugin-import eslint
*/
// {
// test: /\.js$/,
// exclude: /node_modules/,
// loader: 'eslint-loader',
// options: {
// fix
// }
// }
]
},
plugins: [
// 详细plugins的配置
// HtmlWebpackPlugin
// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
// 需求:需要有结构的HTML文件
new HtmlWebpackPlugin({
// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)
template: './src/index.html'
}),
new MiniCssExtractPlugin({
// 对输出的css文件进行重命名
filename: 'css/built.css'
}),
// 压缩css
new OptimizeCssAssetsWebpackPlugin()
],
// 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新)
// 特点:只会在内存中编译打包,不会有任何输出
// 启动devServer指令为:npx webpack-dev-server
devServer: {
// 项目构建后的路径
contentBase: resolve(__dirname, 'build'),
// 启动gzip压缩
compress: true,
// 端口号
port: 3000,
// 自动打开浏览器
open: true
}
}
package.jsoo中
"eslintConfig": {
"extends": "airbnb-base"
}
js兼容性处理
安装 babel-loader@8.0.6 @babel/preset-env@7.8.4
