mirror of
https://github.com/vuejs/core.git
synced 2024-11-21 20:28:45 +00:00
163 lines
4.3 KiB
JavaScript
163 lines
4.3 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 fs from 'node:fs'
|
|
import { dirname, relative, resolve } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { createRequire } from 'node:module'
|
|
import { parseArgs } from 'node:util'
|
|
import { polyfillNode } from 'esbuild-plugin-polyfill-node'
|
|
|
|
const require = createRequire(import.meta.url)
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
|
const {
|
|
values: { format: rawFormat, prod, inline: inlineDeps },
|
|
positionals,
|
|
} = parseArgs({
|
|
allowPositionals: true,
|
|
options: {
|
|
format: {
|
|
type: 'string',
|
|
short: 'f',
|
|
default: 'global',
|
|
},
|
|
prod: {
|
|
type: 'boolean',
|
|
short: 'p',
|
|
default: false,
|
|
},
|
|
inline: {
|
|
type: 'boolean',
|
|
short: 'i',
|
|
default: false,
|
|
},
|
|
},
|
|
})
|
|
|
|
const format = rawFormat || 'global'
|
|
const targets = positionals.length ? positionals : ['vue']
|
|
|
|
// resolve output
|
|
const outputFormat = format.startsWith('global')
|
|
? 'iife'
|
|
: format === 'cjs'
|
|
? 'cjs'
|
|
: 'esm'
|
|
|
|
const postfix = format.endsWith('-runtime')
|
|
? `runtime.${format.replace(/-runtime$/, '')}`
|
|
: format
|
|
|
|
const privatePackages = fs.readdirSync('packages-private')
|
|
|
|
for (const target of targets) {
|
|
const pkgBase = privatePackages.includes(target)
|
|
? `packages-private`
|
|
: `packages`
|
|
const pkgBasePath = `../${pkgBase}/${target}`
|
|
const pkg = require(`${pkgBasePath}/package.json`)
|
|
const outfile = resolve(
|
|
__dirname,
|
|
`${pkgBasePath}/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, `${pkgBasePath}/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')),
|
|
__CJS__: String(format === 'cjs'),
|
|
__SSR__: String(format !== 'global'),
|
|
__COMPAT__: String(target === 'vue-compat'),
|
|
__FEATURE_SUSPENSE__: `true`,
|
|
__FEATURE_OPTIONS_API__: `true`,
|
|
__FEATURE_PROD_DEVTOOLS__: `false`,
|
|
__FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__: `true`,
|
|
},
|
|
})
|
|
.then(ctx => ctx.watch())
|
|
}
|