在应用webpack进行我的项目打包的时候,咱们可通过以下形式对不同类型的资源,进行文件名或文件门路的批改
1、应用copy-webpack-plugin插件复制的文件,这个就是配置from和to
new CopyPlugin({ patterns: [ { from: "**/**.txt", to: "xx/xx.ext" }, ],})
2、批改js文件的文件名
在webpack中有一个output的配置项,能够在这里配置js文件的文件门路和文件名
批改入口文件的文件名
通过配置output的filename属性,能够动静的扭转入口文件的文件门路和文件名,通常的咱们会这样设置filename: "[name].[chunkhash].js"
,而其中的name就是文件名批改的要害,这个name咱们能够在entry入口中进行定义
entry:{ index: path.resolve(__dirname, './src/index.js'), youindex: path.resolve(__dirname, './src/index.js')}
在entry中也能够配置某一个库/组件的文件进行打包
entry:{ ol: path.resolve(__dirname, './static/ol/ol_me.js'),}
filename除了能够设置相似占位符格局的字符串,还能够是一个函数,函数第一个参数中蕴含了打包文件的一系列信息,依据这些信息,能够去自定义打包文件的输入名称
output:{ filename: (pathData) => { return pathData.chunk.name === 'main' ? utils.assetsPath('js/youfilename.js') : utils.assetsPath('js/[name].[chunkhash].js'); }}
filename占位符字符串对应的后果能够由以下参数拼接或者返回:
批改非入口(按需引入)文件的文件名
通过配置output的chunkFilename 属性,能够动静的扭转非入口文件的文件门路和文件名,通常的咱们会这样设置chunkFilename: "[name].[chunkhash].js"
,而其中的name就是文件名批改的要害。
chunkFilename 指未被列在 entry 中,却又须要被打包进去的 chunk 文件的名称,output.chunkFilename 默认应用[id].js或从 output.filename 中推断出的值,id是输入文件的块id,个别是从1开始叠加的数字,除了[id]还能够配置占位符[name],[name]是文件按需引入时配置的chunkName值,如果没有配置chunkName,[name] 会被事后替换为 [id]。
配置好chunkFilename后,还须要在文件按需引入时配置chunkName值,晚期的按需引入应用require.ensure(),这就不说了,当初按需引入根本都是应用import(),在import()中咱们退出chunkFilename 的配置,就能够批改打包后的文件门路和文件名,配置以/* webpackChunkName: “xxx” */
的模式存在
const Login = () => import(/* webpackChunkName: "myLogin" */ '../components/login.vue')
在webpack 4的版本中chunkFilename必须是一个字符串,然而在webpack 5中,他也能够像filename一样设置一个函数,去自定义文件门路和文件名。
chunkFilename字符串占位符对应的后果和filename一样,能够由以下参数拼接或者返回:
3、批改css文件的文件名
webpack对css文件的打包须要用到插件,之前的webpack应用extract-text-webpack-plugin进行css文件打包,这里不讲了,当初的webpack应用mini-css-extract-plugin进行css文件打包。
在mini-css-extract-plugin的配置中,同样有对于filename和chunkFilename的配置,具体用法和批改js文件名的配置一样。
const MiniCssExtractPlugin = require('mini-css-extract-plugin')new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional // filename: utils.assetsPath('css/[name].[contenthash].css'), filename: (pathData) => { return pathData.chunk.name == 'main' ? utils.assetsPath('css/youfilename.[hash].css') : utils.assetsPath('css/[name].[hash].css') }, chunkFilename: (pathData) => { return utils.assetsPath('css/[id].[hash].css') },})
4、批改其余资源文件(图片、视频等)的文件名
webpack对图片等资源文件的打包须要用到url-loader 或者 file-loader 去正当地解决它们,而url-loader外部也是封装了file-loader去解决
webpack中对图片等资源的打包配置在module.rules中,rules中能够通过options属性值,把配置传递给url-loader或者file-loader。file-loader的配置项中有一个属性name,咱们能够通过配置这个name属性来批改打包文件的文件门路和文件名,name的配置同样反对字符串占位符和函数两种模式,通常咱们像上面一样配置字符串的模式
{ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { // 10000字节以下的图片会被转换为base64编码 limit: 10000, // 生成 name+7位hash+ext格局的文件名 name: utils.assetsPath('img/[name].[hash:7].[ext]') } }
其中[name]、[hash]等占位符都和filename的占位符一样
除了字符串模式,还能够像上面一样配置更灵便的函数模式
{ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { // 10000字节以下的图片会被转换为base64编码 limit: 10000, // 生成 name+7位hash+ext格局的文件名 name: function(filepath){ let filename = filepath.split('\\').pop() return process.env.NODE_ENV !== 'development' && filename == 'xxx.png' ? utils.assetsPath('img/youfilename.[ext]') : utils.assetsPath('img/[name].[hash:7].[ext]') } }},