基于Rollup构建的,构建相关配置在scripts目录下

构建脚本

  1. "script": {
  2. "build": "node scripts/build.js",
  3. "build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
  4. "build:weex": "npm run build -- weex"
  5. }

作用都是构建 Vue.js,后面 2 条是在第一条命令的基础上,添加一些环境参数

构建过程

入口文件scripts/build.js

  1. // 读取配置文件
  2. let builds = require('./config').getAllBuilds()
  3. // 通过命令行参数过滤构建
  4. // build:ssr
  5. if (process.argv[2]) {
  6. const filters = process.argv[2].split(',')
  7. builds = builds.filter(b => {
  8. return filters.some(f => b.output.file.indexOf(f) > -1 || b._name.indexOf(f) > -1)
  9. })
  10. } else {
  11. // build:weex
  12. builds = builds.filter(b => {
  13. return b.output.file.indexOf('weex') === -1
  14. })
  15. }
  16. build(builds)

配置文件scripts/config.js

  1. const aliases = require('./alias')
  2. const resolve = p => {
  3. console.log()
  4. const base = p.split('/')[0]
  5. if (aliases[base]) {
  6. return path.resolve(aliases[base], p.slice(base.length + 1))
  7. } else {
  8. return path.resolve(__dirname, '../', p)
  9. }
  10. }
  11. const builds = {
  12. // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
  13. 'web-runtime-cjs-dev': {
  14. entry: resolve('web/entry-runtime.js'), // 构建的入口 JS 文件地址
  15. dest: resolve('dist/vue.runtime.common.dev.js'), // 构建后的 JS 文件地址
  16. format: 'cjs', // 构建的格式 cjs-构建出来的文件遵循CommonJs规范 es-构建出来的文件遵循ES Module规范 umd-构建出来的文件遵循UMD规范
  17. env: 'development', // 环境
  18. banner
  19. },
  20. 'web-runtime-cjs-prod': {
  21. entry: resolve('web/entry-runtime.js'),
  22. dest: resolve('dist/vue.runtime.common.prod.js'),
  23. format: 'cjs',
  24. env: 'production',
  25. banner
  26. },
  27. // Runtime+compiler CommonJS build (CommonJS)
  28. 'web-full-cjs-dev': {
  29. entry: resolve('web/entry-runtime-with-compiler.js'),
  30. dest: resolve('dist/vue.common.dev.js'),
  31. format: 'cjs',
  32. env: 'development',
  33. alias: { he: './entity-decoder' },
  34. banner
  35. },
  36. 'web-full-cjs-prod': {
  37. entry: resolve('web/entry-runtime-with-compiler.js'),
  38. dest: resolve('dist/vue.common.prod.js'),
  39. format: 'cjs',
  40. env: 'production',
  41. alias: { he: './entity-decoder' },
  42. banner
  43. },
  44. // Runtime only ES modules build (for bundlers)
  45. 'web-runtime-esm': {
  46. entry: resolve('web/entry-runtime.js'),
  47. dest: resolve('dist/vue.runtime.esm.js'),
  48. format: 'es',
  49. banner
  50. },
  51. // Runtime+compiler ES modules build (for bundlers)
  52. 'web-full-esm': {
  53. entry: resolve('web/entry-runtime-with-compiler.js'),
  54. dest: resolve('dist/vue.esm.js'),
  55. format: 'es',
  56. alias: { he: './entity-decoder' },
  57. banner
  58. },
  59. // Runtime+compiler ES modules build (for direct import in browser)
  60. 'web-full-esm-browser-dev': {
  61. entry: resolve('web/entry-runtime-with-compiler.js'),
  62. dest: resolve('dist/vue.esm.browser.js'),
  63. format: 'es',
  64. transpile: false,
  65. env: 'development',
  66. alias: { he: './entity-decoder' },
  67. banner
  68. },
  69. // Runtime+compiler ES modules build (for direct import in browser)
  70. 'web-full-esm-browser-prod': {
  71. entry: resolve('web/entry-runtime-with-compiler.js'),
  72. dest: resolve('dist/vue.esm.browser.min.js'),
  73. format: 'es',
  74. transpile: false,
  75. env: 'production',
  76. alias: { he: './entity-decoder' },
  77. banner
  78. },
  79. // runtime-only build (Browser)
  80. 'web-runtime-dev': {
  81. entry: resolve('web/entry-runtime.js'),
  82. dest: resolve('dist/vue.runtime.js'),
  83. format: 'umd',
  84. env: 'development',
  85. banner
  86. },
  87. // runtime-only production build (Browser)
  88. 'web-runtime-prod': {
  89. entry: resolve('web/entry-runtime.js'),
  90. dest: resolve('dist/vue.runtime.min.js'),
  91. format: 'umd',
  92. env: 'production',
  93. banner
  94. },
  95. // Runtime+compiler development build (Browser)
  96. 'web-full-dev': {
  97. entry: resolve('web/entry-runtime-with-compiler.js'),
  98. dest: resolve('dist/vue.js'),
  99. format: 'umd',
  100. env: 'development',
  101. alias: { he: './entity-decoder' },
  102. banner
  103. },
  104. // Runtime+compiler production build (Browser)
  105. 'web-full-prod': {
  106. entry: resolve('web/entry-runtime-with-compiler.js'),
  107. dest: resolve('dist/vue.min.js'),
  108. format: 'umd',
  109. env: 'production',
  110. alias: { he: './entity-decoder' },
  111. banner
  112. },
  113. // Web compiler (CommonJS).
  114. 'web-compiler': {
  115. entry: resolve('web/entry-compiler.js'),
  116. dest: resolve('packages/vue-template-compiler/build.js'),
  117. format: 'cjs',
  118. external: Object.keys(require('../packages/vue-template-compiler/package.json').dependencies)
  119. },
  120. // Web compiler (UMD for in-browser use).
  121. 'web-compiler-browser': {
  122. entry: resolve('web/entry-compiler.js'),
  123. dest: resolve('packages/vue-template-compiler/browser.js'),
  124. format: 'umd',
  125. env: 'development',
  126. moduleName: 'VueTemplateCompiler',
  127. plugins: [node(), cjs()]
  128. },
  129. // Web server renderer (CommonJS).
  130. 'web-server-renderer-dev': {
  131. entry: resolve('web/entry-server-renderer.js'),
  132. dest: resolve('packages/vue-server-renderer/build.dev.js'),
  133. format: 'cjs',
  134. env: 'development',
  135. external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
  136. },
  137. 'web-server-renderer-prod': {
  138. entry: resolve('web/entry-server-renderer.js'),
  139. dest: resolve('packages/vue-server-renderer/build.prod.js'),
  140. format: 'cjs',
  141. env: 'production',
  142. external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
  143. },
  144. 'web-server-renderer-basic': {
  145. entry: resolve('web/entry-server-basic-renderer.js'),
  146. dest: resolve('packages/vue-server-renderer/basic.js'),
  147. format: 'umd',
  148. env: 'development',
  149. moduleName: 'renderVueComponentToString',
  150. plugins: [node(), cjs()]
  151. },
  152. 'web-server-renderer-webpack-server-plugin': {
  153. entry: resolve('server/webpack-plugin/server.js'),
  154. dest: resolve('packages/vue-server-renderer/server-plugin.js'),
  155. format: 'cjs',
  156. external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
  157. },
  158. 'web-server-renderer-webpack-client-plugin': {
  159. entry: resolve('server/webpack-plugin/client.js'),
  160. dest: resolve('packages/vue-server-renderer/client-plugin.js'),
  161. format: 'cjs',
  162. external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
  163. },
  164. // Weex runtime factory
  165. 'weex-factory': {
  166. weex: true,
  167. entry: resolve('weex/entry-runtime-factory.js'),
  168. dest: resolve('packages/weex-vue-framework/factory.js'),
  169. format: 'cjs',
  170. plugins: [weexFactoryPlugin]
  171. },
  172. // Weex runtime framework (CommonJS).
  173. 'weex-framework': {
  174. weex: true,
  175. entry: resolve('weex/entry-framework.js'),
  176. dest: resolve('packages/weex-vue-framework/index.js'),
  177. format: 'cjs'
  178. },
  179. // Weex compiler (CommonJS). Used by Weex's Webpack loader.
  180. 'weex-compiler': {
  181. weex: true,
  182. entry: resolve('weex/entry-compiler.js'),
  183. dest: resolve('packages/weex-template-compiler/build.js'),
  184. format: 'cjs',
  185. external: Object.keys(require('../packages/weex-template-compiler/package.json').dependencies)
  186. }
  187. }

别名配置文件scripts/alias

  1. const path = require('path')
  2. const resolve = p => path.resolve(__dirname, '../', p)
  3. module.exports = {
  4. vue: resolve('src/platforms/web/entry-runtime-with-compiler'),
  5. compiler: resolve('src/compiler'),
  6. core: resolve('src/core'),
  7. shared: resolve('src/shared'),
  8. web: resolve('src/platforms/web'),
  9. weex: resolve('src/platforms/weex'),
  10. server: resolve('src/server'),
  11. sfc: resolve('src/sfc')
  12. }

举例子

web-runtime-cjs-dev 配置为例,entryweb/entry-runtime.js
知步骤看变量值

  1. base |-| web
  2. aliases[base] |-| path.resolve(__dirname, '../', 'src/platforms/web')
  3. p.slice(base.length + 1) |-| 'entry-runtime.js'
  4. return的值 |-| 'D:\selfItems\vue\src\platforms\web\entry-runtime.js'

这样web-runtime-cjs 配置对应的入口文件就找到了,经过Rollup的构建打包后最终会在dist目录下生成vue.runtime.common.js

Runtime Only VS Runtime + Compiler

利用 vue-cli 去初始化 Vue.js 项目的时候会询问是用 Runtime Only 版本的还是 Runtime + Compiler 版本

Runtime Only

使用这个版本的Vue.js时通常需要借助如webpack的vue-loader工具把文件编译成Javascript
是在编译阶段做的,所有只包含运行时Vue.js代码,因而代码体积会更轻量

Runtime + Compiler

如果没有对代码做预编译,但又使用了Vue的template属性并传入一个字符串,则需要在客户端编译模板

  1. // 需要编译器的版本
  2. new Vue({
  3. template: '<div>{{ hi }}</div>'
  4. })
  5. // 这种情况不需要
  6. new Vue({
  7. render (h) {
  8. return h('div', this.hi)
  9. }
  10. })

在Vue2.0中最终渲染都是通过render函数,如果写template属性则需要编译成render函数,那么这个编译过程会发生运行时,所以需要带有编译器的版本
这个编译过程对性能有一定损耗,所以通常推荐使用Runtime-Only的Vue.js