最近又整回vue去了,不說了,還是腳手架先整吧。
假設你已經通過vue create vue-base
有了vue-base 項目
然后我看到
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" },
這里執行的是vue-cli-service
開心😄又來活兒了
我好奇它的webpack基礎配置是什么?就是我本地項目文件不做任何vue.config.js的配置,它能實現什么?
vue-cli-service 其實執行的是 node_modules/.bin/vue-cli-service
最終是執行了@vue/cli-service
const Service = require('../lib/Service') const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())
這里看到首先去new Service,這里初始化配置
然后執行了
service.run(command, args, rawArgv).catch(err => { error(err) process.exit(1) })
run函數里面先執行了this.init 把默認配置初始化好
然后執行了command 這里以server為例,去執行了 lib/commands下面對應的serve.js文件
可以看到這里面也有一些配置,覆蓋了之前的初始化的配置
lib/commands/serve.js
const defaults = { host: '0.0.0.0', port: 8080, https: false }
如何更改vue-cli-service里面默認的端口號呢?
把啟動命令更改為vue-cli-service serve --port 7001
后續可以看到在這里把初始化的很多參數加到 webpack配置里面來
Service.js文件里面
loadUserOptions 這個方法里面獲取了用戶的vue.config.js命名的文件信息或者是package.json 里面 vue字段的信息
關於配置 Service.js這里
const { defaults, validate } = require(’./options’)
options.js
export default {}
出來一份配置
說一下這個文件里面引入的@vue/cli-shared-utils 就像一個校驗一樣,這里處理的很棒!
const builtInPlugins = [ './commands/serve', './commands/build', './commands/inspect', './commands/help', // config plugins are order sensitive './config/base', './config/css', './config/prod', './config/app' ].map(idToPlugin) if (inlinePlugins) { plugins = useBuiltIn !== false ? builtInPlugins.concat(inlinePlugins) : inlinePlugins } else { const projectPlugins = Object.keys(this.pkg.devDependencies || {}) .concat(Object.keys(this.pkg.dependencies || {})) .filter(isPlugin) .map(id => { if ( this.pkg.optionalDependencies && id in this.pkg.optionalDependencies ) { let apply = () => {} try { apply = require(id) } catch (e) { warn(`Optional dependency ${id} is not installed.`) } return { id, apply } } else { return idToPlugin(id) } }) plugins = builtInPlugins.concat(projectPlugins) }
里面有一個這個對象,配置各個命令和配置,看起來是做了prod和base的區分配置 后面是做了一個合並
prod.js里面看到
首先是通過webpack-chain 鏈接的各個配置
module.exports = (api, options) => { api.chainWebpack(webpackConfig => { if (process.env.NODE_ENV === 'production') { production 環境 webpackConfig .mode('production') //瞧這里設置了mode .devtool(options.productionSourceMap ? 'source-map' : false) // keep module.id stable when vendor modules does not change webpackConfig .plugin('hash-module-ids') .use(require('webpack/lib/HashedModuleIdsPlugin'), [{ hashDigest: 'hex' }]) // disable optimization during tests to speed things up if (process.env.VUE_CLI_TEST) { webpackConfig.optimization.minimize(false) } } }) }
在base.js
然后你就看到了這么些的默認配置
webpackConfig .mode('development') .context(api.service.context) .entry('app') .add('./src/main.js') .end() .output .path(api.resolve(options.outputDir)) .filename(isLegacyBundle ? '[name]-legacy.js' : '[name].js') .publicPath(options.publicPath)
基礎的entry ,output
alias .set('@', api.resolve('src')) .set( 'vue$', options.runtimeCompiler ? 'vue/dist/vue.esm.js' : 'vue/dist/vue.runtime.esm.js' )
配置了別名 @指向項目src目錄
以下是在 vue 2的項目中,一旦換成 vue 3的項目就沒了,所以放在了try catch中
這里可以看到對, .vue文件啟用了cache-loader,緩存,啟用了vue-loader 這個來轉換vue文件
繼續往下處理了images、svg、media、fonts文件
很意外的看到了關於.pug后綴文件的處理,可能是其它包里面的?這里沒有仔細去看了
最后
增加了terser默認的內置壓縮工具包,做壓縮
這里的配置有一個terserOptions.js文件
更改的
https://cli.vuejs.org/zh/config/#vue-config-js