Vue2.5.9源码解读(2) — build/config.js
2017-11-28 19:37
531 查看
const banner = '/*!\n' + ' * Vue.js v' + version + '\n' + ' * (c) 2014-' + new Date().getFullYear() + ' Evan You\n' + ' * Released under the MIT License.\n' + ' */'
在生成的文件中添加的vuejs版本、版权、许可声明信息。
// 为一些路径起别名 const aliases = { vue: resolve('src/platforms/web/entry-runtime-with-compiler'), compiler: resolve('src/compiler'), core: resolve('src/core'), shared: resolve('src/shared'), web: resolve('src/platforms/web'), weex: resolve('src/platforms/weex'), server: resolve('src/server'), entries: resolve('src/entries'), // 2.5.9版本中已经不存在这个目录,只是别名模块中还存在[不影响] sfc: resolve('src/sfc') }; // 判断别名对象中是否存在传入参数的第一个元素对应的键值 const resolve = p => { // 将传入字符串参数分割成数组,并取出第一个元素 const base = p.split('/')[0] // 如果别名对象中存在第一个元素对应的键值,则返回的路径为别名对应值与参数除第一个元素外的字符串组成的全路径,参看示例1。 if (aliases[base]) { return path.resolve(aliases[base], p.slice(base.length + 1)) } // 否则,返回值为当前目录的上一级路径与参数组成的全路径,参看示例2。 else { return path.resolve(__dirname, '../', p) } } // 示例 1. resolve('web/entry-runtime-with-compiler.js'); => [vue-2.5.9/]src/platforms/web/entry-runtime-with-compiler.js 2. resolve('dist/vue.js'); => [vue-2.5.9/]/dist/vue.js
resolve主要是为了方便操作路径。
// 可以认为是编译的对象的配置,源码中都有对每个对象的注释 const builds = { // 只运行时(CommonJS). 使用bundlers,如Webpack、Browserify 'web-runtime-cjs': ..., // 运行时+编译 CommonJS构建(CommonJS) 'web-full-cjs': ..., // 只运行时(ES Modules). 使用支持ES Modules的bundler,如Rollup、Webpack2 'web-runtime-esm': ..., // 运行时+编译 ES Modules构建(ES Modules) 'web-full-esm': ..., // 只运行时,开发环境构建(Browser) 'web-runtime-dev': ..., // 只运行时,生产环境构建(Browser) 'web-runtime-prod': ..., // 运行时+编译 开发环境构建(Browser) 'web-full-dev': ..., // 运行时+编译 生产环境构建(Browser) 'web-full-prod': ..., // web平台 编译(CommonJS) 'web-compiler': ..., // web平台 编译(Browser) 'web-compiler-browser': ..., // web平台服务端渲染(CommonJS) 'web-server-renderer': ..., // web平台服务端渲染(UMD) 'web-server-basic-renderer': ..., // web平台服务端渲染(CommonJS),使用webpack server插件 'web-server-renderer-webpack-server-plugin': ..., // web平台服务端渲染(CommonJS),使用webpack client插件 'web-server-renderer-webpack-client-plugin': ..., // weex平台 运行时 factory (CommonJS) 'weex-factory': ..., // weex平台 运行时 framework (CommonJS) 'weex-framework': ..., // weex平台 编译 (CommonJS)。使用weex的webpack装载器 'weex-compiler': ... }; // 根据不同的process.env.TARGET生成不同的配置 function genConfig (name) { const opts = builds[name] const config = { input: opts.entry, external: opts.external, plugins: [ replace({ __WEEX__: !!opts.weex, __WEEX_VERSION__: weexVersion, __VERSION__: version }), flow(), buble(), alias(Object.assign({}, aliases, opts.alias)) ].concat(opts.plugins || []), output: { file: opts.dest, format: opts.format, banner: opts.banner, name: opts.moduleName || 'Vue' } } // 如果有配置env,则修改config.plugins中的process.env.NODE_ENV的值为配置的env值 if (opts.env) { config.plugins.push(replace({ 'process.env.NODE_ENV': JSON.stringify(opts.env) })) } // 为config定义一个_name属性,属性值为enumerable和value Object.defineProperty(config, '_name', { enumerable: false, // 不可枚举 value: name }) return config }
genConfig根据指定的process.env.TARGET与builds中的键做对比,如果在builds中存在对应的键,则生成并对应的配置。这里并没有做指定的process.env.TARGET不存在于builds中的处理。
if (process.env.TARGET) { module.exports = genConfig(process.env.TARGET) } else { exports.getBuild = genConfig exports.getAllBuilds = () => Object.keys(builds).map(genConfig) }
如果指定了process.env.TARGET,则按指定的导出;否则提供getBuild和getAllBuilds方法。
相关文章推荐
- Vuejs2.5.9源码解读(1) — package.json
- vue.js 源码解读
- vueJs源码解读0-2
- push.js 源码解读
- vue-cli脚手架build目录中的webpack.prod.conf.js配置文件
- vue源码解读预热-0
- Vue.js 源码学习笔记
- ntv.js框架源码解读 - 4navigation.js
- Node.js-require() 源码解读
- [源码解读] FastClick.js源码解读
- Vue.js实现表格动态增加删除的方法(附源码下载)
- Vue Socket.io源码解读
- prototype 源码解读 之 prototype.js
- vue-cli脚手架build目录中的webpack.dev.conf.js配置文件
- Vue学习之源码分析--Vue.js事件机制(四)
- 为什么vue-cli创建的build文件下没有dev-server.js文件
- 史上最详细的 webpack 讲解 1 (vue-cli 中 build.js)
- OpenLayers 2 源码解读(2) Class.js
- [Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt
- webpack.config.js源码解析