mirror of https://github.com/vuejs/core.git
				
				
				
			
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
// @ts-check
 | 
						|
 | 
						|
// Using esbuild for faster dev builds.
 | 
						|
// We are still using Rollup for production builds because it generates
 | 
						|
// smaller files and provides better tree-shaking.
 | 
						|
 | 
						|
import esbuild from 'esbuild'
 | 
						|
import { dirname, relative, resolve } from 'node:path'
 | 
						|
import { fileURLToPath } from 'node:url'
 | 
						|
import { createRequire } from 'node:module'
 | 
						|
import minimist from 'minimist'
 | 
						|
import { polyfillNode } from 'esbuild-plugin-polyfill-node'
 | 
						|
 | 
						|
const require = createRequire(import.meta.url)
 | 
						|
const __dirname = dirname(fileURLToPath(import.meta.url))
 | 
						|
const args = minimist(process.argv.slice(2))
 | 
						|
const targets = args._ || ['vue']
 | 
						|
const format = args.f || 'global'
 | 
						|
const prod = args.p || false
 | 
						|
const inlineDeps = args.i || args.inline
 | 
						|
 | 
						|
// resolve output
 | 
						|
const outputFormat = format.startsWith('global')
 | 
						|
  ? 'iife'
 | 
						|
  : format === 'cjs'
 | 
						|
    ? 'cjs'
 | 
						|
    : 'esm'
 | 
						|
 | 
						|
const postfix = format.endsWith('-runtime')
 | 
						|
  ? `runtime.${format.replace(/-runtime$/, '')}`
 | 
						|
  : format
 | 
						|
 | 
						|
for (const target of targets) {
 | 
						|
  const pkg = require(`../packages/${target}/package.json`)
 | 
						|
  const outfile = resolve(
 | 
						|
    __dirname,
 | 
						|
    `../packages/${target}/dist/${
 | 
						|
      target === 'vue-compat' ? `vue` : target
 | 
						|
    }.${postfix}.${prod ? `prod.` : ``}js`,
 | 
						|
  )
 | 
						|
  const relativeOutfile = relative(process.cwd(), outfile)
 | 
						|
 | 
						|
  // resolve externals
 | 
						|
  // TODO this logic is largely duplicated from rollup.config.js
 | 
						|
  /** @type {string[]} */
 | 
						|
  let external = []
 | 
						|
  if (!inlineDeps) {
 | 
						|
    // cjs & esm-bundler: external all deps
 | 
						|
    if (format === 'cjs' || format.includes('esm-bundler')) {
 | 
						|
      external = [
 | 
						|
        ...external,
 | 
						|
        ...Object.keys(pkg.dependencies || {}),
 | 
						|
        ...Object.keys(pkg.peerDependencies || {}),
 | 
						|
        // for @vue/compiler-sfc / server-renderer
 | 
						|
        'path',
 | 
						|
        'url',
 | 
						|
        'stream',
 | 
						|
      ]
 | 
						|
    }
 | 
						|
 | 
						|
    if (target === 'compiler-sfc') {
 | 
						|
      const consolidatePkgPath = require.resolve(
 | 
						|
        '@vue/consolidate/package.json',
 | 
						|
        {
 | 
						|
          paths: [resolve(__dirname, `../packages/${target}/`)],
 | 
						|
        },
 | 
						|
      )
 | 
						|
      const consolidateDeps = Object.keys(
 | 
						|
        require(consolidatePkgPath).devDependencies,
 | 
						|
      )
 | 
						|
      external = [
 | 
						|
        ...external,
 | 
						|
        ...consolidateDeps,
 | 
						|
        'fs',
 | 
						|
        'vm',
 | 
						|
        'crypto',
 | 
						|
        'react-dom/server',
 | 
						|
        'teacup/lib/express',
 | 
						|
        'arc-templates/dist/es5',
 | 
						|
        'then-pug',
 | 
						|
        'then-jade',
 | 
						|
      ]
 | 
						|
    }
 | 
						|
  }
 | 
						|
  /** @type {Array<import('esbuild').Plugin>} */
 | 
						|
  const plugins = [
 | 
						|
    {
 | 
						|
      name: 'log-rebuild',
 | 
						|
      setup(build) {
 | 
						|
        build.onEnd(() => {
 | 
						|
          console.log(`built: ${relativeOutfile}`)
 | 
						|
        })
 | 
						|
      },
 | 
						|
    },
 | 
						|
  ]
 | 
						|
 | 
						|
  if (format !== 'cjs' && pkg.buildOptions?.enableNonBrowserBranches) {
 | 
						|
    plugins.push(polyfillNode())
 | 
						|
  }
 | 
						|
 | 
						|
  esbuild
 | 
						|
    .context({
 | 
						|
      entryPoints: [resolve(__dirname, `../packages/${target}/src/index.ts`)],
 | 
						|
      outfile,
 | 
						|
      bundle: true,
 | 
						|
      external,
 | 
						|
      sourcemap: true,
 | 
						|
      format: outputFormat,
 | 
						|
      globalName: pkg.buildOptions?.name,
 | 
						|
      platform: format === 'cjs' ? 'node' : 'browser',
 | 
						|
      plugins,
 | 
						|
      define: {
 | 
						|
        __COMMIT__: `"dev"`,
 | 
						|
        __VERSION__: `"${pkg.version}"`,
 | 
						|
        __DEV__: prod ? `false` : `true`,
 | 
						|
        __TEST__: `false`,
 | 
						|
        __BROWSER__: String(
 | 
						|
          format !== 'cjs' && !pkg.buildOptions?.enableNonBrowserBranches,
 | 
						|
        ),
 | 
						|
        __GLOBAL__: String(format === 'global'),
 | 
						|
        __ESM_BUNDLER__: String(format.includes('esm-bundler')),
 | 
						|
        __ESM_BROWSER__: String(format.includes('esm-browser')),
 | 
						|
        __NODE_JS__: String(format === 'cjs'),
 | 
						|
        __SSR__: String(format === 'cjs' || format.includes('esm-bundler')),
 | 
						|
        __COMPAT__: String(target === 'vue-compat'),
 | 
						|
        __FEATURE_SUSPENSE__: `true`,
 | 
						|
        __FEATURE_OPTIONS_API__: `true`,
 | 
						|
        __FEATURE_PROD_DEVTOOLS__: `false`,
 | 
						|
        __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__: `false`,
 | 
						|
      },
 | 
						|
    })
 | 
						|
    .then(ctx => ctx.watch())
 | 
						|
}
 |