config.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. // we are bundling forked consolidate.js in compiler-sfc which dynamically
  25. // requires a ton of template engines which should be ignored.
  26. const consolidatePath = require.resolve('@vue/consolidate/package.json', {
  27. paths: [path.resolve(__dirname, '../packages/compiler-sfc')]
  28. })
  29. const builds = {
  30. // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
  31. 'runtime-cjs-dev': {
  32. entry: resolve('web/entry-runtime.ts'),
  33. dest: resolve('dist/vue.runtime.common.dev.js'),
  34. format: 'cjs',
  35. env: 'development',
  36. banner
  37. },
  38. 'runtime-cjs-prod': {
  39. entry: resolve('web/entry-runtime.ts'),
  40. dest: resolve('dist/vue.runtime.common.prod.js'),
  41. format: 'cjs',
  42. env: 'production',
  43. banner
  44. },
  45. // Runtime+compiler CommonJS build (CommonJS)
  46. 'full-cjs-dev': {
  47. entry: resolve('web/entry-runtime-with-compiler.ts'),
  48. dest: resolve('dist/vue.common.dev.js'),
  49. format: 'cjs',
  50. env: 'development',
  51. alias: { he: './entity-decoder' },
  52. banner
  53. },
  54. 'full-cjs-prod': {
  55. entry: resolve('web/entry-runtime-with-compiler.ts'),
  56. dest: resolve('dist/vue.common.prod.js'),
  57. format: 'cjs',
  58. env: 'production',
  59. alias: { he: './entity-decoder' },
  60. banner
  61. },
  62. // Runtime only ES modules build (for bundlers)
  63. 'runtime-esm': {
  64. entry: resolve('web/entry-runtime-esm.ts'),
  65. dest: resolve('dist/vue.runtime.esm.js'),
  66. format: 'es',
  67. banner
  68. },
  69. // Runtime only ES modules build (for Node)
  70. 'runtime-mjs': {
  71. entry: resolve('web/entry-runtime-esm.ts'),
  72. dest: resolve('dist/vue.runtime.mjs'),
  73. format: 'es',
  74. banner
  75. },
  76. // Runtime+compiler ES modules build (for bundlers)
  77. 'full-esm': {
  78. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  79. dest: resolve('dist/vue.esm.js'),
  80. format: 'es',
  81. alias: { he: './entity-decoder' },
  82. banner
  83. },
  84. // Runtime+compiler ES modules build (for direct import in browser)
  85. 'full-esm-browser-dev': {
  86. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  87. dest: resolve('dist/vue.esm.browser.js'),
  88. format: 'es',
  89. transpile: false,
  90. env: 'development',
  91. alias: { he: './entity-decoder' },
  92. banner
  93. },
  94. // Runtime+compiler ES modules build (for direct import in browser)
  95. 'full-esm-browser-prod': {
  96. entry: resolve('web/entry-runtime-with-compiler-esm.ts'),
  97. dest: resolve('dist/vue.esm.browser.min.js'),
  98. format: 'es',
  99. transpile: false,
  100. env: 'production',
  101. alias: { he: './entity-decoder' },
  102. banner
  103. },
  104. // runtime-only build (Browser)
  105. 'runtime-dev': {
  106. entry: resolve('web/entry-runtime.ts'),
  107. dest: resolve('dist/vue.runtime.js'),
  108. format: 'umd',
  109. env: 'development',
  110. banner
  111. },
  112. // runtime-only production build (Browser)
  113. 'runtime-prod': {
  114. entry: resolve('web/entry-runtime.ts'),
  115. dest: resolve('dist/vue.runtime.min.js'),
  116. format: 'umd',
  117. env: 'production',
  118. banner
  119. },
  120. // Runtime+compiler development build (Browser)
  121. 'full-dev': {
  122. entry: resolve('web/entry-runtime-with-compiler.ts'),
  123. dest: resolve('dist/vue.js'),
  124. format: 'umd',
  125. env: 'development',
  126. alias: { he: './entity-decoder' },
  127. banner
  128. },
  129. // Runtime+compiler production build (Browser)
  130. 'full-prod': {
  131. entry: resolve('web/entry-runtime-with-compiler.ts'),
  132. dest: resolve('dist/vue.min.js'),
  133. format: 'umd',
  134. env: 'production',
  135. alias: { he: './entity-decoder' },
  136. banner
  137. },
  138. // Web compiler (CommonJS).
  139. compiler: {
  140. entry: resolve('web/entry-compiler.ts'),
  141. dest: resolve('packages/template-compiler/build.js'),
  142. format: 'cjs',
  143. external: Object.keys(
  144. require('../packages/template-compiler/package.json').dependencies
  145. )
  146. },
  147. // Web compiler (UMD for in-browser use).
  148. 'compiler-browser': {
  149. entry: resolve('web/entry-compiler.ts'),
  150. dest: resolve('packages/template-compiler/browser.js'),
  151. format: 'umd',
  152. env: 'development',
  153. moduleName: 'VueTemplateCompiler',
  154. plugins: [node(), cjs()]
  155. },
  156. // Web server renderer (CommonJS).
  157. 'server-renderer-dev': {
  158. entry: resolve('packages/server-renderer/src/index.ts'),
  159. dest: resolve('packages/server-renderer/build.dev.js'),
  160. format: 'cjs',
  161. env: 'development',
  162. external: [
  163. 'stream',
  164. ...Object.keys(
  165. require('../packages/server-renderer/package.json').dependencies
  166. )
  167. ]
  168. },
  169. 'server-renderer-prod': {
  170. entry: resolve('server/index.ts'),
  171. dest: resolve('packages/server-renderer/build.prod.js'),
  172. format: 'cjs',
  173. env: 'production',
  174. external: [
  175. 'stream',
  176. ...Object.keys(
  177. require('../packages/server-renderer/package.json').dependencies
  178. )
  179. ]
  180. },
  181. 'server-renderer-basic': {
  182. entry: resolve('server/index-basic.ts'),
  183. dest: resolve('packages/server-renderer/basic.js'),
  184. format: 'umd',
  185. env: 'development',
  186. moduleName: 'renderVueComponentToString',
  187. plugins: [node(), cjs()]
  188. },
  189. 'server-renderer-webpack-server-plugin': {
  190. entry: resolve('server/webpack-plugin/server.ts'),
  191. dest: resolve('packages/server-renderer/server-plugin.js'),
  192. format: 'cjs',
  193. external: Object.keys(
  194. require('../packages/server-renderer/package.json').dependencies
  195. )
  196. },
  197. 'server-renderer-webpack-client-plugin': {
  198. entry: resolve('server/webpack-plugin/client.ts'),
  199. dest: resolve('packages/server-renderer/client-plugin.js'),
  200. format: 'cjs',
  201. external: Object.keys(
  202. require('../packages/server-renderer/package.json').dependencies
  203. )
  204. },
  205. 'compiler-sfc': {
  206. entry: resolve('packages/compiler-sfc/src/index.ts'),
  207. dest: resolve('packages/compiler-sfc/dist/compiler-sfc.js'),
  208. format: 'cjs',
  209. external: Object.keys(
  210. require('../packages/compiler-sfc/package.json').dependencies
  211. ),
  212. plugins: [
  213. node({ preferBuiltins: true }),
  214. cjs({
  215. ignore: [
  216. ...Object.keys(require(consolidatePath).devDependencies),
  217. 'vm',
  218. 'crypto',
  219. 'react-dom/server',
  220. 'teacup/lib/express',
  221. 'arc-templates/dist/es5',
  222. 'then-pug',
  223. 'then-jade'
  224. ]
  225. })
  226. ]
  227. }
  228. }
  229. function genConfig(name) {
  230. const opts = builds[name]
  231. // console.log('__dir', __dirname)
  232. const config = {
  233. input: opts.entry,
  234. external: opts.external,
  235. plugins: [
  236. alias({
  237. entries: Object.assign({}, aliases, opts.alias)
  238. }),
  239. ts({
  240. tsconfig: path.resolve(__dirname, '../', 'tsconfig.json'),
  241. cacheRoot: path.resolve(__dirname, '../', 'node_modules/.rts2_cache'),
  242. tsconfigOverride: {
  243. compilerOptions: {
  244. // if targeting browser, target es5
  245. // if targeting node, es2017 means Node 8
  246. target:
  247. opts.transpile === false || opts.format === 'cjs'
  248. ? 'es2017'
  249. : 'es5'
  250. },
  251. exclude: ['test', 'test-dts']
  252. }
  253. })
  254. ].concat(opts.plugins || []),
  255. output: {
  256. file: opts.dest,
  257. format: opts.format,
  258. banner: opts.banner,
  259. name: opts.moduleName || 'Vue',
  260. exports: 'auto'
  261. },
  262. onwarn: (msg, warn) => {
  263. if (!/Circular/.test(msg)) {
  264. warn(msg)
  265. }
  266. }
  267. }
  268. // console.log('pluging', config.plugins)
  269. // built-in vars
  270. const vars = {
  271. __VERSION__: version,
  272. __DEV__: `process.env.NODE_ENV !== 'production'`,
  273. __TEST__: false,
  274. __GLOBAL__: opts.format === 'umd' || name.includes('browser')
  275. }
  276. // feature flags
  277. Object.keys(featureFlags).forEach(key => {
  278. vars[`process.env.${key}`] = featureFlags[key]
  279. })
  280. // build-specific env
  281. if (opts.env) {
  282. vars['process.env.NODE_ENV'] = JSON.stringify(opts.env)
  283. vars.__DEV__ = opts.env !== 'production'
  284. }
  285. vars.preventAssignment = true
  286. config.plugins.push(replace(vars))
  287. Object.defineProperty(config, '_name', {
  288. enumerable: false,
  289. value: name
  290. })
  291. return config
  292. }
  293. if (process.env.TARGET) {
  294. module.exports = genConfig(process.env.TARGET)
  295. } else {
  296. exports.getBuild = genConfig
  297. exports.getAllBuilds = () => Object.keys(builds).map(genConfig)
  298. }