Skip to content

Commit

Permalink
build: use rollup -w for dev bundling
Browse files Browse the repository at this point in the history
`tsc` does not support custom file extensions, which is used for the
emitted client files.

It does not understand the `exports` field of other packages,
making it impossible to use pure-ESM dependencies (vitejs#4059),
  • Loading branch information
sodatea committed Jul 8, 2021
1 parent d377aae commit 7109421
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 73 deletions.
4 changes: 1 addition & 3 deletions packages/vite/package.json
Expand Up @@ -31,9 +31,7 @@
"homepage": "https://github.com/vitejs/vite/tree/main/#readme",
"scripts": {
"predev": "rimraf dist",
"dev": "run-p dev-client dev-node",
"dev-client": "tsc -w --incremental --p src/client",
"dev-node": "tsc -w --incremental --p src/node",
"dev": "rollup -c -w",
"prebuild": "rimraf dist && yarn lint",
"build": "run-s build-bundle build-types",
"build-bundle": "rollup -c",
Expand Down
164 changes: 94 additions & 70 deletions packages/vite/rollup.config.js
Expand Up @@ -91,76 +91,91 @@ const sharedNodeOptions = {
}

/**
* @type { import('rollup').RollupOptions }
*
* @param {boolean} isDev
* @returns {import('rollup').RollupOptions}
*/
const nodeConfig = {
...sharedNodeOptions,
input: {
index: path.resolve(__dirname, 'src/node/index.ts'),
cli: path.resolve(__dirname, 'src/node/cli.ts')
},
external: [
'fsevents',
...Object.keys(require('./package.json').dependencies)
],
plugins: [
alias({
// packages with "module" field that doesn't play well with cjs bundles
entries: {
'@vue/compiler-dom': require.resolve(
'@vue/compiler-dom/dist/compiler-dom.cjs.js'
),
'big.js': require.resolve('big.js/big.js')
}
}),
nodeResolve({ preferBuiltins: true }),
typescript({
target: 'es2019',
include: ['src/**/*.ts'],
esModuleInterop: true
}),
// Some deps have try...catch require of optional deps, but rollup will
// generate code that force require them upfront for side effects.
// Shim them with eval() so rollup can skip these calls.
shimDepsPlugin({
'plugins/terser.ts': {
src: `require.resolve('terser'`,
replacement: `require.resolve('vite/dist/node/terser'`
},
// chokidar -> fsevents
'fsevents-handler.js': {
src: `require('fsevents')`,
replacement: `eval('require')('fsevents')`
},
// cac re-assigns module.exports even in its mjs dist
'cac/dist/index.mjs': {
src: `if (typeof module !== "undefined") {`,
replacement: `if (false) {`
},
// postcss-import -> sugarss
'process-content.js': {
src: 'require("sugarss")',
replacement: `eval('require')('sugarss')`
},
'import-from/index.js': {
pattern: /require\(resolveFrom/g,
replacement: `eval('require')(resolveFrom`
},
'lilconfig/dist/index.js': {
pattern: /: require,/g,
replacement: `: eval('require'),`
}
}),
// Optional peer deps of ws. Native deps that are mostly for performance.
// Since ws is not that perf critical for us, just ignore these deps.
ignoreDepPlugin({
bufferutil: 1,
'utf-8-validate': 1
}),
commonjs({ extensions: ['.js'] }),
json(),
licensePlugin()
]
const createNodeConfig = (isDev) => {
const isProduction = !isDev
/**
* @type { import('rollup').RollupOptions }
*/
const nodeConfig = {
...sharedNodeOptions,
input: {
index: path.resolve(__dirname, 'src/node/index.ts'),
cli: path.resolve(__dirname, 'src/node/cli.ts')
},
external: [
'fsevents',
...Object.keys(require('./package.json').dependencies),
...(isDev ? Object.keys(require('./package.json').devDependencies) : [])
],
plugins: [
alias({
// packages with "module" field that doesn't play well with cjs bundles
entries: {
'@vue/compiler-dom': require.resolve(
'@vue/compiler-dom/dist/compiler-dom.cjs.js'
),
'big.js': require.resolve('big.js/big.js')
}
}),
nodeResolve({ preferBuiltins: true }),
typescript({
target: 'es2019',
include: ['src/**/*.ts'],
esModuleInterop: true
}),
// Some deps have try...catch require of optional deps, but rollup will
// generate code that force require them upfront for side effects.
// Shim them with eval() so rollup can skip these calls.
isProduction &&
shimDepsPlugin({
'plugins/terser.ts': {
src: `require.resolve('terser'`,
replacement: `require.resolve('vite/dist/node/terser'`
},
// chokidar -> fsevents
'fsevents-handler.js': {
src: `require('fsevents')`,
replacement: `eval('require')('fsevents')`
},
// cac re-assigns module.exports even in its mjs dist
'cac/dist/index.mjs': {
src: `if (typeof module !== "undefined") {`,
replacement: `if (false) {`
},
// postcss-import -> sugarss
'process-content.js': {
src: 'require("sugarss")',
replacement: `eval('require')('sugarss')`
},
'import-from/index.js': {
pattern: /require\(resolveFrom/g,
replacement: `eval('require')(resolveFrom`
},
'lilconfig/dist/index.js': {
pattern: /: require,/g,
replacement: `: eval('require'),`
}
}),
// Optional peer deps of ws. Native deps that are mostly for performance.
// Since ws is not that perf critical for us, just ignore these deps.
ignoreDepPlugin({
bufferutil: 1,
'utf-8-validate': 1
}),
commonjs({
extensions: ['.js'],
ignore: ['bufferutil', 'utf-8-validate']
}),
json(),
isProduction && licensePlugin()
]
}

return nodeConfig
}

/**
Expand Down Expand Up @@ -360,4 +375,13 @@ function licensePlugin() {
})
}

export default [envConfig, clientConfig, nodeConfig, terserConfig]
export default (commandLineArgs) => {
const isDev = Boolean(commandLineArgs.watch)

return [
envConfig,
clientConfig,
createNodeConfig(isDev),
...(isDev ? [] : [terserConfig])
]
}

0 comments on commit 7109421

Please sign in to comment.