webpack.config.js 是 webpack 的配置文件。
作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
所有构建工具都是基于 nodejs 平台运行的,模块化默认采用 commonjs。
开发环境配置(总)
开发环境配置主要是为了能让代码运行。主要考虑以下几个方面:
- 打包样式资源
npm i css-loader style-loader less-loader less -D - 打包 html 资源
npm install --save-dev html-webpack-plugin - 打包图片资源
npm install --save-dev html-loader@0.5.5 url-loader file-loader- webpack5.0可以使用内置的 Asset Modules,css文件像 background 和 icon 这样的图像无需
**url-loader file-loader** - webpack5.0 依然需要
html-loader解析html中img
- webpack5.0可以使用内置的 Asset Modules,css文件像 background 和 icon 这样的图像无需
- 打包其他资源
npm install --save-dev file-loader- webpack5.0使用 Asset Modules 可以加载任何类型的文件,也包括字体。 test: /.( woff | woff2 | eot | ttf | otf )$/i
- 开发服务器 devServer:用来自动化,不用每次修改后都重新输入webpack打包一遍(自动编译,自动打开浏览器,自动刷新浏览器):
npm install webpack-dev-server -D- 注意事项
- 先执行webpack打包生成代码到dist 否则会报错,因为server指定文件时dist
- 因为是本地运行没有全局安装 所以要使用npx,而webpack 是全局安装所以webpack即可
- 出现下图错误时因为npx时 全局的webpack找不到 devServer,所有要本地安装一下webpack和webpack-cli,再执行npx…

- 4.0运行 npx webpack-dev-server
- 5.0运行 npx webpack serve或4.0那个都可以 加—open打开浏览器
- 注意事项
下面是一个简单的开发环境webpack.confg.js配置文件
/*webpack.config.js webpack的配置文件作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。*/// resolve用来拼接绝对路径的方法const { resolve } = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {// webpack配置// 入口起点entry: './src/index.js',// 输出output: {// 输出文件名filename: 'built.js',// 输出路径// __dirname nodejs的变量,代表当前文件的目录绝对路径path: resolve(__dirname, 'build')},// loader的配置module: {rules: [// 详细loader配置// 不同文件必须配置不同loader处理{// 匹配哪些文件test: /\.css$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序:从右到左,从下到上 依次执行// 创建style标签,将js中的样式资源插入进行,添加到head中生效//后边提取css文件会去掉这个loader'style-loader',// 将css文件变成commonjs模块加载js中,里面内容是样式字符串'css-loader']},{test: /\.s[ac]ss$/i,use: [// 将 JS 字符串生成为 style 节点'style-loader',// 将 CSS 转化成 CommonJS 模块'css-loader',// 将 Sass 编译成 CSS'sass-loader',],},{// url-loader:处理图片资源,问题:默认处理不了html中的img图片test: /\.(jpg|png|gif)$/,// 需要下载 url-loader file-loaderloader: 'url-loader',options: {// 图片大小小于8kb,就会被base64处理,优点:减少请求数量(减轻服务器压力),缺点:图片体积会更大(文件请求速度更慢)// base64在客户端本地解码所以会减少服务器压力,如果图片过大还采用base64编码会导致cpu调用率上升,网页加载时变卡limit: 8 * 1024,// 给图片重命名,[hash:10]:取图片的hash的前10位,[ext]:取文件原来扩展名name: '[name].[hash:10].[ext]',// 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是conmonjs,解析时会出问题:[object Module]// 解决:关闭url-loader的es6模块化,使用commonjs解析esModule: false,//指定打包路径outputPath: 'imgs',},},{test: /\.html$/,//@0.5.5 否则图片打不开// 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)loader: 'html-loader',},{// 排除html|js|css|less|jpg|png|gif文件exclude: /\.(html|js|css|scss|jpg|png|gif)$/,// file-loader:处理其他文件loader: 'file-loader',options: {name: '[hash:10].[ext]',outputPath: 'media',},}]},// plugins的配置plugins: [// plugins的配置// html-webpack-plugin// 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)// 需求:需要有结构的HTML文件new HtmlWebpackPlugin({// 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)template: './src/index.html',filename:'app.html'//script标签放置的位置inject:'body'})],// 模式mode: 'development', // 开发模式// mode: 'production',// 开发服务器 devServer:用来自动化,不用每次修改后都重新输入webpack打包一遍(自动编译,自动打开浏览器,自动刷新浏览器)// 特点:只会在内存中编译打包,不会有任何输出(不会像之前那样在外面看到打包输出的build包,而是在内存中,关闭后会自动删除)// 启动devServer指令为:npx webpack-dev-serverdevServer: {// 项目构建后路径//contentBase: resolve(__dirname, 'build'),//4.0static: resolve(__dirname, 'build'),//5.0// 启动gzip压缩compress: true,// 端口号port: 3000,// 自动打开浏览器open: true,},}
其中,大部分配置都在注释中给出解释。
- 运行项目的两个指令:
webpack 会将打包结果输出出去(build文件夹)
npx webpack-dev-server 只会在内存中编译打包,没有输出 - loader 和 plugin 的不同:(plugin 一定要先引入才能使用)loader:1. 下载 2. 使用(配置 loader)plugins:1.下载 2. 引入 3. 使用
资源模块
资源模块(asset module)是一种模块类型,它允许我们应用Webpack来打包其他资 源文件(如字体,图标等)
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:
asset/resource发送一个单独的文件并导出 URL。asset/inline导出一个资源的 data URI。asset/source导出资源的源代码。asset在导出一个 data URI 和发送一个单独的文件之间自动选择。resource 资源
```javascript module: { rules: [{ test: /.png/, type: ‘asset/resource’ }] },
<a name="e3bUe"></a>#### 自定义输出文件名默认情况下, asset/resource 模块以 [contenthash][ext][query] 文件名 发送到输出目录。```javascriptoutput: {assetModuleFilename: 'images/[contenthash][ext][query]'},
另一种自定义输出文件名的方式是,将某些资源发送到指定目录,修改配置:
rules: [{test: /\.png/,type: 'asset/resource',// 优先级高于 assetModuleFilenamegenerator: {filename: 'images/[contenthash][ext][query]'}}]
inline 资源
module: {rules:[{test: /\.svg/,type: 'asset/inline'}],}
自定义 data URI 生成器
webpack 输出的 data URI,默认是呈现为使用 Base64 算法编码的文件内容。 如果要使用自定义编码算法,则可以指定一个自定义函数来编码文件内容。 npm install mini-svg-data-uri -D
const svgToMiniDataURI = require('mini-svg-data-uri')rules: [{test: /\.svg/,type: 'asset/inline',generator: {dataUrl: content => {content = content.toString();return svgToMiniDataURI(content);}}}]
source 资源
source资源,导出资源的源代码。
module: {rules: [test: /\.txt/,type: 'asset/source']}
asset 通用资源类型
通用资源类型 asset , 在导出一个 data URI 和发送一个单独的文件之间自动选择
module: {rules: [test: /\.jpg/,type: 'asset']}
现在,webpack 将按照默认条件,自动地在 resource 和 inline 之间进行选择: 小于 8kb 的文件,将会视为 inline 模块类型,否则会被视为 resource 模块类型。
rules: [{test: /\.jpg/,type: 'asset',parser: {//修改默认8kb 为4kbdataUrlCondition: {maxSize: 4 * 1024 // 4kb}}}]

