dev.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Using esbuild for faster dev builds.
  2. // We are still using Rollup for production builds because it generates
  3. // smaller files w/ better tree-shaking.
  4. // @ts-check
  5. const { context } = require('esbuild')
  6. const nodePolyfills = require('@esbuild-plugins/node-modules-polyfill')
  7. const { resolve, relative } = require('path')
  8. const args = require('minimist')(process.argv.slice(2))
  9. const target = args._[0] || 'vue'
  10. const format = args.f || 'global'
  11. const inlineDeps = args.i || args.inline
  12. const pkg = require(resolve(__dirname, `../packages/${target}/package.json`))
  13. // resolve output
  14. const outputFormat = format.startsWith('global')
  15. ? 'iife'
  16. : format === 'cjs'
  17. ? 'cjs'
  18. : 'esm'
  19. const postfix = format.endsWith('-runtime')
  20. ? `runtime.${format.replace(/-runtime$/, '')}`
  21. : format
  22. const outfile = resolve(
  23. __dirname,
  24. `../packages/${target}/dist/${
  25. target === 'vue-compat' ? `vue` : target
  26. }.${postfix}.js`
  27. )
  28. const relativeOutfile = relative(process.cwd(), outfile)
  29. // resolve externals
  30. // TODO this logic is largely duplicated from rollup.config.js
  31. let external = []
  32. if (!inlineDeps) {
  33. // cjs & esm-bundler: external all deps
  34. if (format === 'cjs' || format.includes('esm-bundler')) {
  35. external = [
  36. ...external,
  37. ...Object.keys(pkg.dependencies || {}),
  38. ...Object.keys(pkg.peerDependencies || {}),
  39. // for @vue/compiler-sfc / server-renderer
  40. 'path',
  41. 'url',
  42. 'stream'
  43. ]
  44. }
  45. if (target === 'compiler-sfc') {
  46. const consolidateDeps = require.resolve('@vue/consolidate/package.json', {
  47. paths: [resolve(__dirname, `../packages/${target}/`)]
  48. })
  49. external = [
  50. ...external,
  51. ...Object.keys(require(consolidateDeps).devDependencies),
  52. 'fs',
  53. 'vm',
  54. 'crypto',
  55. 'react-dom/server',
  56. 'teacup/lib/express',
  57. 'arc-templates/dist/es5',
  58. 'then-pug',
  59. 'then-jade'
  60. ]
  61. }
  62. }
  63. const plugins = [
  64. {
  65. name: 'log-rebuild',
  66. setup(build) {
  67. build.onEnd(() => {
  68. console.log(`built: ${relativeOutfile}`)
  69. })
  70. }
  71. }
  72. ]
  73. if (format === 'cjs' || pkg.buildOptions?.enableNonBrowserBranches) {
  74. plugins.push(nodePolyfills.default())
  75. }
  76. context({
  77. entryPoints: [resolve(__dirname, `../packages/${target}/src/index.ts`)],
  78. outfile,
  79. bundle: true,
  80. external,
  81. sourcemap: true,
  82. format: outputFormat,
  83. globalName: pkg.buildOptions?.name,
  84. platform: format === 'cjs' ? 'node' : 'browser',
  85. plugins,
  86. define: {
  87. __COMMIT__: `"dev"`,
  88. __VERSION__: `"${pkg.version}"`,
  89. __DEV__: `true`,
  90. __TEST__: `false`,
  91. __BROWSER__: String(
  92. format !== 'cjs' && !pkg.buildOptions?.enableNonBrowserBranches
  93. ),
  94. __GLOBAL__: String(format === 'global'),
  95. __ESM_BUNDLER__: String(format.includes('esm-bundler')),
  96. __ESM_BROWSER__: String(format.includes('esm-browser')),
  97. __NODE_JS__: String(format === 'cjs'),
  98. __SSR__: String(format === 'cjs' || format.includes('esm-bundler')),
  99. __COMPAT__: String(target === 'vue-compat'),
  100. __FEATURE_SUSPENSE__: `true`,
  101. __FEATURE_OPTIONS_API__: `true`,
  102. __FEATURE_PROD_DEVTOOLS__: `false`
  103. }
  104. }).then(ctx => ctx.watch())