VUE3.0的打包配置修改

VUE3.0的打包配置修改

最近在玩在线工具这一块,网上有一个开源应用:PPTist,能够还原大部分PPT功能,实现了PPT的在线编辑、演示。

从Git拉下来的代码,使用npm编译后,js文件名字,后面都带一堆hash,且JS的内部全部经过混淆了,变量、函数名称变成abcd之类,很不爽,也不好调试、定位。

经过网络上的一通搜索、学习。VUE3默认情况了,发布的生产版本,会对js进行混淆,文件名也带hash,希望修改这个默认,需要修改vue.config.js。(网上很多是说webpack.config.js,vue确实是通过webpack打包,但他也对webpack进行了封装,新版本的VUE是看不到webpack.config.js文件了)。

PPTist的vue.config.js文件内容目前为:

/* eslint-disable @typescript-eslint/no-var-requires */

const StyleLintPlugin = require('stylelint-webpack-plugin')

module.exports = {
  publicPath: './',
  css: {
    loaderOptions: {
      sass: {
        prependData: `
          @import '~@/assets/styles/variable.scss';
          @import '~@/assets/styles/mixin.scss';
        `,
      },
      less: {
        lessOptions: {
          modifyVars: {
            'primary-color': '#d14424',
            'text-color': '#41464b',
            'font-size-base': '13px',
            'border-radius-base': '2px',
          },
          javascriptEnabled: true,
        },
      },
    },
  },
  configureWebpack: {
    plugins: [
      new StyleLintPlugin({
        files: ['src/**/*.{vue,html,css,scss,sass,less}'],
        failOnError: false,
        cache: false,
        fix: false,
      }),
    ],
  },
  pwa: {
    name: 'PPTist',
    themeColor: '#d14424',
    iconPaths: {
      faviconSVG: null,
      favicon32: 'icons/favicon-32x32.png',
      favicon16: 'icons/favicon-16x16.png',
      appleTouchIcon: 'icons/apple-touch-icon-152x152.png',
      maskIcon: null,
      msTileImage: null,
    },
    manifestOptions: {
      name: 'PPTist',
      short_name: 'PPTist',
      theme_color: '#d14424',
      icons: [{
        src: 'icons/android-chrome-192x192.png',
        sizes: '192x192',
        type: 'image/png'
      }, {
        src: 'icons/android-chrome-512x512.png',
        sizes: '512x512',
        type: 'image/png'
      }, {
        src: 'icons/android-chrome-maskable-192x192.png',
        sizes: '192x192',
        type: 'image/png',
        purpose: 'maskable'
      }, {
        src: 'icons/android-chrome-maskable-512x512.png',
        sizes: '512x512',
        type: 'image/png',
        purpose: 'maskable'
      }],
      start_url: '.',
      display: 'standalone',
      background_color: '#000000',
    },
    workboxOptions: {
      runtimeCaching: [{
        urlPattern: /.*/,
        handler: 'networkFirst',
        options: {
          cacheName: 'PPTist',
          expiration: {
            maxAgeSeconds: 60 * 60 * 10,
          },
          cacheableResponse: {
            statuses: [0, 200]
          }
        }
      }],
      include: [
        /\.ttf$/,
      ],
      skipWaiting: true,
    }
  },
}

详细解说可以参考其他资料。

首先我们找到,configureWebpack部分的内容。

configureWebpack的内容,根据资料,可以为一个对象或函数。如果这个值是一个对象,则会通过 webpack-merge 合并到最终的配置中。

如果这个值是一个函数,则会接收被解析的配置作为参数。该函数及可以修改配置并不返回任何东西,也可以返回一个被克隆或合并过的配置版本。

(VUE还支持chainWebpack选项配置,chainWebpack 通过链式编程的形式,来修改默认的webpack配置)

在当前的vue.config.js中,可以看到是一个对象,对象内容是一个StyleLintPlugin实例。

而网络上搜索到的,根据环境修改配置,则为一个函数,因此先注释掉原有配置。

修改为:

  configureWebpack: (config) => {
    if (process.env.NODE_ENV === 'production') {
      // 为生产环境修改配置...
      config.mode = 'production'
      // 将每个依赖包打包成单独的js文件
      let optimization = {
        runtimeChunk: 'single',
		minimize: false,
        splitChunks: {
          chunks: 'all',
          maxInitialRequests: Infinity,
          minSize: 20000, // 依赖包超过20000bit将被单独打包
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name (module) {
                // get the name. E.g. node_modules/packageName/not/this/part.js
                // or node_modules/packageName
                const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                // npm package names are URL-safe, but some servers don't like @ symbols
                return `npm.${packageName.replace('@', '')}`
              }
            }
          }
        }
      }
      Object.assign(config, {
        optimization
      })
    }
  },

此处的修改,参考了https://www.cnblogs.com/ypSharing/p/vue-webpack.html。

这儿的optimization中,minimize为false,则表示不进行代码最小、混淆化。

而splitChunks则不合并当前组件所依赖的模块js文件,会在当前目录下生成以node的modules名对应的js与js.map文件。

修改configureWebpack为函数后,将原来的功能恢复过来,则增加如下代码:

//configureWebpack: {
    //plugins: [
    //  new StyleLintPlugin({
    //    files: ['src/**/*.{vue,html,css,scss,sass,less}'],
    //    failOnError: false,
    //    cache: false,
    //    fix: false,
     // }),
    //],
  //},
  configureWebpack: (config) => {
    if (process.env.NODE_ENV === 'production') {
      // 为生产环境修改配置...
      config.mode = 'production'
      // 将每个依赖包打包成单独的js文件
      let optimization = {
        runtimeChunk: 'single',
		minimize: false,
        splitChunks: {
          chunks: 'all',
          maxInitialRequests: Infinity,
          minSize: 20000, // 依赖包超过20000bit将被单独打包
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name (module) {
                // get the name. E.g. node_modules/packageName/not/this/part.js
                // or node_modules/packageName
                const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                // npm package names are URL-safe, but some servers don't like @ symbols
                return `npm.${packageName.replace('@', '')}`
              }
            }
          }
        }
      }
      Object.assign(config, {
        optimization
      })
    }
    config.plugins.push(
      new StyleLintPlugin({
        files: ['src/**/*.{vue,html,css,scss,sass,less}'],
        failOnError: false,
        cache: false,
        fix: false,
    })
	)
  },

在if语句之后,修改config.plugins,往其中添加一个StyleLintPlugin实例。

PPTist的代码库,项目的版本号为v0.0.1,实在不适合用来添加到文件名上。

因此采用获取Git代码库的提交Hash方式(短hash)来重新命名js文件。

首先在vue.config.js文件头部添加如下代码,以取得Git提交Hash。

const execSync = require('child_process').execSync; //同步子进程
const GIT_HASH = execSync('git show -s --format=%h').toString().trim(); //当前提交的版本号

然后修改configureWebpack内容为:

    //configureWebpack: {
    //plugins: [
    //  new StyleLintPlugin({
    //    files: ['src/**/*.{vue,html,css,scss,sass,less}'],
    //    failOnError: false,
    //    cache: false,
    //    fix: false,
     // }),
    //],
  //},
  configureWebpack: (config) => {
    if (process.env.NODE_ENV === 'production') {
      // 为生产环境修改配置...
      config.mode = 'production'
      // 将每个依赖包打包成单独的js文件
      let optimization = {
        runtimeChunk: 'single',
		minimize: false,
        splitChunks: {
          chunks: 'all',
          maxInitialRequests: Infinity,
          minSize: 20000, // 依赖包超过20000bit将被单独打包
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name (module) {
                // get the name. E.g. node_modules/packageName/not/this/part.js
                // or node_modules/packageName
                const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                // npm package names are URL-safe, but some servers don't like @ symbols
                return `npm.${packageName.replace('@', '')}`
              }
            }
          }
        }
      }
      Object.assign(config, {
        optimization
      })
    }
    config.plugins.push(
      new StyleLintPlugin({
        files: ['src/**/*.{vue,html,css,scss,sass,less}'],
        failOnError: false,
        cache: false,
        fix: false,
    })
	)
	config.output.filename = '[name].' + GIT_HASH + '.js'
	config.output.chunkFilename = '[name].' + GIT_HASH + '.js'
  },

至此,生成的js文件不再是以文件内容hash为后缀了(每次打包不同,可能就会导致Hash变化)。

使用Git库的提交Hash,根据此Hash,可以很容易定位到Git代码中结点,更容易在开发、调试过程中找到对应代码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章