Vue.js-Vue CLI 3.x 静态资源文件编译输出目录定制的问题及解决

第一步:定制静态资源根目录

这一步是Vue工程配置的基本操做,在Vue CLI官方文档讲的很明确了,在vue.config.js中配置assetsdir属性便可。css

未设置或设置为默认值assetsdir: '',生成的目录是这样的:vue

指定明确的目录,即生成相对于publicPath的路径,如assetsdir: './assets'或者assetsdir: 'assets',生成的目录是这样的:node

这样使得目录结构更清晰明了。bash

第二步:区分静态资源与动态生成的资源

若是在工程中已经提供了一部分全局静态资源,如normalize.css,为保持目录的统一可能也放置在public/assets/css目录下,这样,在最终的编译输出中,文件可能被大量的chunk-文件淹没。字体

这样咱们须要给输出的文件单独设置子目录,因而能够设置cssextract属性,在开发环境时,咱们能够直接设置为true以启用css文件的抽离,在生产环境则能够直接指定生成的chunkFile的目录。ui

css: {
    extract: process.env.NODE_ENV === 'development' || {
        chunkFilename: 'assets/css/chunk/[name]-[hash].css',
    },
},
复制代码

运行编译咱们能够获得这样的目录结构spa

第三步:踩坑

若是在源码中存在相对路径的引用,编译过程将会自动进行处理,如字体、图片等,经过查询Vue CLI的源码,发现其是采用filename的值来计算相对路径的深度的。而filename默认路径为./assets/css/file.css,所以第二步中咱们设定chunkFilename多了一层目录chunk,致使资源路径引用出现404错误。因此filenamechunkFilename能够不在同一目录,但必定要保持相同的层级深度。插件

// use relative publicPath in extracted CSS based on extract location
const cssPublicPath = process.env.VUE_CLI_BUILD_TARGET === 'lib'
    // in lib mode, CSS is extracted to dist root.
    ? './'
    : '../'.repeat(
    extractOptions.filename
        .replace(/^\.[\/\\]/, '')
        .split(/[\/\\]/g)
        .length - 1
)
复制代码
css: {
    extract: process.env.NODE_ENV === 'development' || {
        // filename必须与chunkFilename层级一致,\node_modules\@vue\cli-service\lib\config\css.js 42行
        filename: `assets/css/[name]/[name]-[hash].css`,
        chunkFilename: 'assets/css/chunk/[name]-[hash].css',
    },
},
复制代码

第三步:js文件的编译输出

js文件的编译输出则比较灵活一些,在configureWebpack方法中能够进行更多的操做,也没有filenamechunkFilename路径绑定的问题,此处给出简单的示例。code

configureWebpack () {
    let config = {
      plugins: [],
    }
    if (process.env.NODE_ENV === 'production') {
        config.output = {
            filename: (chunkData) {
                // 经过chunkData能够根据chunkData.chunk.name进行更多区分
                return `[name]/[name]-${hash}.js`
            },
            chunkFilename: `assets/js/chunk/[id]-[hash].js`,
        }
    }
    // 一些其余的插件设置
    // 最终返回配置
    return config
}
复制代码
相关文章
相关标签/搜索