config.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. const path = require('path')
  2. const alias = require('@rollup/plugin-alias')
  3. const cjs = require('@rollup/plugin-commonjs')
  4. const replace = require('@rollup/plugin-replace')
  5. const node = require('@rollup/plugin-node-resolve').nodeResolve
  6. const ts = require('rollup-plugin-typescript2')
  7. const version = process.env.VERSION || require('../package.json').version
  8. const featureFlags = require('./feature-flags')
  9. const banner =
  10. '/*!\n' +
  11. ` * Vue.js v${version}\n` +
  12. ` * (c) 2014-${new Date().getFullYear()} Evan You\n` +
  13. ' * Released under the MIT License.\n' +
  14. ' */'
  15. const aliases = require('./alias')
  16. const resolve = p => {
  17. const base = p.split('/')[0]
  18. if (aliases[base]) {
  19. return path.resolve(aliases[base], p.slice(base.length + 1))
  20. } else {
  21. return path.resolve(__dirname, '../', p)
  22. }
  23. }
  24. const builds = {
  25. // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
  26. 'runtime-cjs-dev': {
  27. entry: resolve('web/entry-runtime.ts'),
  28. dest: resolve('dist/vue.runtime.common.dev.js'),
  29. format: 'cjs',
  30. env: 'development',
  31. banner
  32. },
  33. 'runtime-cjs-prod': {
  34. entry: resolve('web/entry-runtime.ts'),
  35. dest: resolve('dist/vue.runtime.common.prod.js'),
  36. format: 'cjs',
  37. env: 'production',
  38. banner
  39. },
  40. // Runtime+compiler CommonJS build (CommonJS)
  41. 'full-cjs-dev': {
  42. entry: resolve('web/entry-runtime-with-compiler.ts'),
  43. dest: resolve('dist/vue.common.dev.js'),
  44. format: 'cjs',
  45. env: 'development',
  46. alias: { he: './entity-decoder' },
  47. banner
  48. },
  49. 'full-cjs-prod': {
  50. entry: resolve('web/entry-runtime-with-compiler.ts'),
  51. dest: resolve('dist/vue.common.prod.js'),
  52. format: 'cjs',
  53. env: 'production',
  54. alias: { he: './entity-decoder' },
  55. banner
  56. },
  57. // Runtime only ES modules build (for bundlers)
  58. 'runtime-esm': {
  59. entry: resolve('web/entry-runtime-esm.ts'),
  60. dest: resolve('dist/vue.runtime.esm.js'),
  61. format: 'es',
  62. banner
  63. },
  64. // Runtime only ES modules build (for Node)
  65. 'runtime-mjs': {
  66. entry: resolve('web/entry-runtime-esm.ts'),
  67. dest: resolve('dist/vue.runtime.mjs'),
  68. format: 'es',
  69. banner
  70. },
  71. // Runtime+compiler ES modules build (for bundlers)
  72. 'full-esm': {
  73. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  74. dest: resolve('dist/vue.esm.js'),
  75. format: 'es',
  76. alias: { he: './entity-decoder' },
  77. banner
  78. },
  79. // Runtime+compiler ES modules build (for direct import in browser)
  80. 'full-esm-browser-dev': {
  81. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  82. dest: resolve('dist/vue.esm.browser.js'),
  83. format: 'es',
  84. transpile: false,
  85. env: 'development',
  86. alias: { he: './entity-decoder' },
  87. banner
  88. },
  89. // Runtime+compiler ES modules build (for direct import in browser)
  90. 'full-esm-browser-prod': {
  91. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  92. dest: resolve('dist/vue.esm.browser.min.js'),
  93. format: 'es',
  94. transpile: false,
  95. env: 'production',
  96. alias: { he: './entity-decoder' },
  97. banner
  98. },
  99. // runtime-only build (Browser)
  100. 'runtime-dev': {
  101. entry: resolve('web/entry-runtime.ts'),
  102. dest: resolve('dist/vue.runtime.js'),
  103. format: 'umd',
  104. env: 'development',
  105. banner
  106. },
  107. // runtime-only production build (Browser)
  108. 'runtime-prod': {
  109. entry: resolve('web/entry-runtime.ts'),
  110. dest: resolve('dist/vue.runtime.min.js'),
  111. format: 'umd',
  112. env: 'production',
  113. banner
  114. },
  115. // Runtime+compiler development build (Browser)
  116. 'full-dev': {
  117. entry: resolve('web/entry-runtime-with-compiler.ts'),
  118. dest: resolve('dist/vue.js'),
  119. format: 'umd',
  120. env: 'development',
  121. alias: { he: './entity-decoder' },
  122. banner
  123. },
  124. // Runtime+compiler production build (Browser)
  125. 'full-prod': {
  126. entry: resolve('web/entry-runtime-with-compiler.ts'),
  127. dest: resolve('dist/vue.min.js'),
  128. format: 'umd',
  129. env: 'production',
  130. alias: { he: './entity-decoder' },
  131. banner
  132. },
  133. // Web compiler (CommonJS).
  134. compiler: {
  135. entry: resolve('web/entry-compiler.ts'),
  136. dest: resolve('packages/template-compiler/build.js'),
  137. format: 'cjs',
  138. external: Object.keys(
  139. require('../packages/template-compiler/package.json').dependencies
  140. )
  141. },
  142. // Web compiler (UMD for in-browser use).
  143. 'compiler-browser': {
  144. entry: resolve('web/entry-compiler.ts'),
  145. dest: resolve('packages/template-compiler/browser.js'),
  146. format: 'umd',
  147. env: 'development',
  148. moduleName: 'VueTemplateCompiler',
  149. plugins: [node(), cjs()]
  150. },
  151. // Web server renderer (CommonJS).
  152. 'server-renderer-dev': {
  153. entry: resolve('packages/server-renderer/src/index.ts'),
  154. dest: resolve('packages/server-renderer/build.dev.js'),
  155. format: 'cjs',
  156. env: 'development',
  157. external: [
  158. 'stream',
  159. ...Object.keys(
  160. require('../packages/server-renderer/package.json').dependencies
  161. )
  162. ]
  163. },
  164. 'server-renderer-prod': {
  165. entry: resolve('server/index.ts'),
  166. dest: resolve('packages/server-renderer/build.prod.js'),
  167. format: 'cjs',
  168. env: 'production',
  169. external: [
  170. 'stream',
  171. ...Object.keys(
  172. require('../packages/server-renderer/package.json').dependencies
  173. )
  174. ]
  175. },
  176. 'server-renderer-basic': {
  177. entry: resolve('server/index-basic.ts'),
  178. dest: resolve('packages/server-renderer/basic.js'),
  179. format: 'umd',
  180. env: 'development',
  181. moduleName: 'renderVueComponentToString',
  182. plugins: [node(), cjs()]
  183. },
  184. 'server-renderer-webpack-server-plugin': {
  185. entry: resolve('server/webpack-plugin/server.ts'),
  186. dest: resolve('packages/server-renderer/server-plugin.js'),
  187. format: 'cjs',
  188. external: Object.keys(
  189. require('../packages/server-renderer/package.json').dependencies
  190. )
  191. },
  192. 'server-renderer-webpack-client-plugin': {
  193. entry: resolve('server/webpack-plugin/client.ts'),
  194. dest: resolve('packages/server-renderer/client-plugin.js'),
  195. format: 'cjs',
  196. external: Object.keys(
  197. require('../packages/server-renderer/package.json').dependencies
  198. )
  199. },
  200. 'compiler-sfc': {
  201. entry: resolve('web/entry-compiler-sfc.ts'),
  202. dest: resolve('packages/compiler-sfc/dist/compiler-sfc.js'),
  203. format: 'cjs',
  204. external: Object.keys(
  205. require('../packages/compiler-sfc/package.json').dependencies
  206. )
  207. }
  208. }
  209. function genConfig(name) {
  210. const opts = builds[name]
  211. // console.log('__dir', __dirname)
  212. const config = {
  213. input: opts.entry,
  214. external: opts.external,
  215. plugins: [
  216. alias({
  217. entries: Object.assign({}, aliases, opts.alias)
  218. }),
  219. ts({
  220. tsconfig: path.resolve(__dirname, '../', 'tsconfig.json'),
  221. cacheRoot: path.resolve(__dirname, '../', 'node_modules/.rts2_cache'),
  222. tsconfigOverride: {
  223. compilerOptions: {
  224. // if targeting browser, target es5
  225. // if targeting node, es2017 means Node 8
  226. target: opts.transpile === false ? 'es2017' : 'es5'
  227. },
  228. exclude: ['test', 'test-dts']
  229. }
  230. })
  231. ].concat(opts.plugins || []),
  232. output: {
  233. file: opts.dest,
  234. format: opts.format,
  235. banner: opts.banner,
  236. name: opts.moduleName || 'Vue',
  237. exports: 'auto'
  238. },
  239. onwarn: (msg, warn) => {
  240. if (!/Circular/.test(msg)) {
  241. warn(msg)
  242. }
  243. }
  244. }
  245. // console.log('pluging', config.plugins)
  246. // built-in vars
  247. const vars = {
  248. __VERSION__: version,
  249. __DEV__: `process.env.NODE_ENV !== 'production'`
  250. }
  251. // feature flags
  252. Object.keys(featureFlags).forEach(key => {
  253. vars[`process.env.${key}`] = featureFlags[key]
  254. })
  255. // build-specific env
  256. if (opts.env) {
  257. vars['process.env.NODE_ENV'] = JSON.stringify(opts.env)
  258. vars.__DEV__ = opts.env !== 'production'
  259. }
  260. vars.preventAssignment = true
  261. config.plugins.push(replace(vars))
  262. Object.defineProperty(config, '_name', {
  263. enumerable: false,
  264. value: name
  265. })
  266. return config
  267. }
  268. if (process.env.TARGET) {
  269. module.exports = genConfig(process.env.TARGET)
  270. } else {
  271. exports.getBuild = genConfig
  272. exports.getAllBuilds = () => Object.keys(builds).map(genConfig)
  273. }