config.js 8.6 KB

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