面试题答案
一键面试1. 基础Webpack配置
- 安装必要的loader和插件
- 图片处理:
file - loader
用于处理图片文件,image - webpack - loader
用于图片压缩。
npm install file - loader image - webpack - loader --save - dev
- 字体处理:
url - loader
用于处理字体文件,它可以将小字体文件转换为DataURL。
npm install url - loader --save - dev
- 图片处理:
- Webpack通用配置(webpack.common.js)
- 图片处理:
module.exports = { module: { rules: [ { test: /\.(png|jpg|jpeg|gif)$/i, use: [ { loader: 'file - loader', options: { name: 'images/[name].[ext]', publicPath: '../' } } ] } ] } };
- 字体处理:
module.exports = { module: { rules: [ { test: /\.(woff|woff2|eot|ttf|otf)$/i, use: [ { loader: 'url - loader', options: { limit: 8192, name: 'fonts/[name].[ext]', publicPath: '../' } } ] } ] } };
2. 开发环境配置(webpack.dev.js)
- 差异化配置思路:开发环境注重构建速度,所以对图片和字体资源的处理相对宽松。
- 配置实现:
- 图片处理:在
webpack.dev.js
中,我们可以不启用image - webpack - loader
,保持file - loader
的基础配置。
const common = require('./webpack.common.js'); const { merge } = require('webpack - merge'); module.exports = merge(common, { mode: 'development' });
- 字体处理:保持
url - loader
的基础配置,不做额外优化。
- 图片处理:在
3. 生产环境配置(webpack.prod.js)
- 差异化配置思路:生产环境要求极致的性能优化,对图片进行无损压缩,对字体进行按需加载。
- 配置实现:
- 图片处理:在
webpack.prod.js
中,添加image - webpack - loader
进行图片无损压缩。
const common = require('./webpack.common.js'); const { merge } = require('webpack - merge'); module.exports = merge(common, { mode: 'production', module: { rules: [ { test: /\.(png|jpg|jpeg|gif)$/i, use: [ { loader: 'file - loader', options: { name: 'images/[name].[ext]', publicPath: '../' } }, { loader: 'image - webpack - loader', options: { mozjpeg: { progressive: true, quality: 65 }, // optipng.enabled: false will disable optipng optipng: { enabled: false }, pngquant: { quality: [0.65, 0.90], speed: 4 }, gifsicle: { interlaced: false }, // the webp option will enable WEBP webp: { quality: 75 } } } ] } ] } });
- 字体处理:可以考虑使用一些字体按需加载的工具,例如
font - loader
,结合@font - face
的font - display
属性来优化字体加载。
module.exports = merge(common, { mode: 'production', module: { rules: [ { test: /\.(woff|woff2|eot|ttf|otf)$/i, use: [ { loader: 'url - loader', options: { limit: 8192, name: 'fonts/[name].[ext]', publicPath: '../' } }, // 假设引入font - loader { loader: 'font - loader', options: { // 按需加载配置 } } ] } ] } });
- 图片处理:在
4. 实现不同环境差异化配置的方式
- 使用
webpack - merge
:通过webpack - merge
库,可以将通用配置(webpack.common.js
)与不同环境(开发webpack.dev.js
、生产webpack.prod.js
)的差异化配置进行合并。这样可以避免重复代码,同时保持配置的清晰和可维护性。 - 环境变量:在构建脚本中,可以通过设置环境变量(如
NODE_ENV
)来区分不同环境。例如,在package.json
中:
Webpack配置文件中可以根据{ "scripts": { "dev": "NODE_ENV = development webpack - - config webpack.dev.js", "build": "NODE_ENV = production webpack - - config webpack.prod.js" } }
process.env.NODE_ENV
来做一些条件判断,进一步定制不同环境的配置。
通过以上基于Webpack的配置方案,可以实现一套完整的、可灵活调整的图片与字体资源打包方案,满足不同环境下的打包需求。