这一步是Vue工程配置的基本操做,在Vue CLI官方文档讲的很明确了,在vue.config.js
中配置assetsdir属性便可。css
未设置或设置为默认值assetsdir: ''
,生成的目录是这样的:vue
指定明确的目录,即生成相对于publicPath
的路径,如assetsdir: './assets'
或者assetsdir: 'assets'
,生成的目录是这样的:node
这样使得目录结构更清晰明了。bash
若是在工程中已经提供了一部分全局静态资源,如normalize.css
,为保持目录的统一可能也放置在public/assets/css
目录下,这样,在最终的编译输出中,文件可能被大量的chunk-
文件淹没。字体
这样咱们须要给输出的文件单独设置子目录,因而能够设置css
的extract
属性,在开发环境时,咱们能够直接设置为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
错误。因此filename
与chunkFilename
能够不在同一目录,但必定要保持相同的层级深度。插件
// 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文件的编译输出则比较灵活一些,在configureWebpack
方法中能够进行更多的操做,也没有filename
与chunkFilename
路径绑定的问题,此处给出简单的示例。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
}
复制代码