这篇拖了很久了,想想还是趁着清明把债给补上把。
前言
之前遇到个需求, 要把前端所有图片变成CDN链接。但是还没有接触过 webpack 相关配置, 只能硬着头皮上了。
常用参数
- entry - 程序的启动入口(多页应用的话可以配置数组)
- context - 上下文路径(绝对路径)
- output - 输出消息
- path - 输出文件存放的路径
- filename - 输出文件名
- module - 对不同模块的处理
- rules - 根据规则对不同的文件做处理 ( loader )
- plugins - 插件数组
- resolve - 解析
- alias - 别名 (在
import
和require
中可以使用)
- devServer - webpack 提供的本地 server
- contentBase - 启动目录
- compress - gzip 压缩
- port - 服务的端口号
简单的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| const webpack = require('webpack') const path = require('path')
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = { module: { rules: [{ include: [path.resolve(__dirname, 'src')], loader: 'babel-loader', options: { plugins: ['syntax-dynamic-import'],
presets: [['@babel/preset-env', { 'modules': false }]] }, test: /\.js$/ }, { test: /\.(scss|css)$/, use: [{ loader: 'style-loader' options: {} }, { loader: 'css-loader' }, { loader: 'sass-loader' }] }] }, output: { path: '/dist', filename: '[name].[chunkhash].js' }, mode: 'development', plugins: [ new UglifyJSPlugin() ] }
|
话说回来
简单的介绍过后,那如何去实现一个图片CDN化的操作。简单来说就两步:
- 找到所有图片
- 将图片的路径替换成 CDN 链接
我这里用了file-loader
去做这个处理,顺便将替换的域名提取出来,与公共的配置放到一起方便管理,代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| ... { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, use: [ { loader: 'file-loader', options: { name: '[path][name].[ext]', context: '/', publicPath: url => { let tmpStr = path.resolve('../public');
tmpStr = tmpStr.split(path.sep).join('/'); tmpStr = tmpStr.replace(/^([C-Z]:)?\//, '');
url = url.replace(tmpStr, ''); return utils.getStaticHost(debug) + url; }, emitFile: false, } } ] } ...
|
补充一下
想要文件被loader
解析到需要以import
或 require
引入,然后以变量的方式引用。
vue 的 template 会转换成 js 引用,所以不需要特殊处理
1 2 3 4 5 6 7
| <template> <img :src="img"/> <img :src="require('./1.jpg')"/> <template> <script> import img from './1.jpg'; <script/>>
|