From fa094cab9fb4a410d07ad298c16f39388f80d37e Mon Sep 17 00:00:00 2001 From: "guo.xu" Date: Wed, 17 Mar 2021 15:47:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4js=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugin-cmd-roll-lib/src/modify.ts | 34 ++++++---- .../plugin-cmd-roll-lib/src/plugins/css.ts | 11 +--- .../src/plugins/esbuild.ts | 29 ++++---- .../plugin-cmd-roll-lib/src/plugins/minify.ts | 66 ++++++++++++------- .../src/resolveConfig/index.ts | 3 +- packages/plugin-lib-legacy/src/index.ts | 7 -- packages/plugin-lib-legacy/src/plugin.ts | 3 + packages/plugin-lib-vue-jsx/src/index.ts | 4 +- 8 files changed, 91 insertions(+), 66 deletions(-) diff --git a/packages/plugin-cmd-roll-lib/src/modify.ts b/packages/plugin-cmd-roll-lib/src/modify.ts index f463c17..74337e8 100644 --- a/packages/plugin-cmd-roll-lib/src/modify.ts +++ b/packages/plugin-cmd-roll-lib/src/modify.ts @@ -30,26 +30,20 @@ export function modifyConfig( ]) rc.plugin('commonjs').use(commonjs).after('commonjs') - const sourcemap = !!resolvedConfig.sourcemap - const target = resolvedConfig.target // esbuild rc.plugin('$$esbuild').use(esbuildPlugin, [ { - include: /\.(jsx?|tsx?)$/, - target, - sourcemap + include: /\.(jsx|tsx?)$/, + exclude: /\.js$/ } ]) // minify + const target = resolvedConfig.target rc.plugin('$$minify').use(minifyPlugin, [ { minify: resolvedConfig.minify, esbuildMinifyOps: { - target, - sourcemap - }, - terserMinifyOps: { - sourceMap: sourcemap + target } } ]) @@ -60,7 +54,6 @@ export function modifyConfig( { injectScript: css.injectScript, cssCodeSplit: css.cssCodeSplit, - sourceMap: sourcemap, minify: !!resolvedConfig.minify, modules: css.modules || {}, postcss: css.postcss, @@ -97,6 +90,8 @@ export function modifyConfig( ]) // external + // TODO: excludeExternal config + getPkgDeps(api.cwd).forEach((dep) => rc.external.set(dep)) // onwarn rc.onwarn((warning, onwarn) => { @@ -109,3 +104,20 @@ function onRollupWarning(warning: RollupWarning, onwarn: WarningHandler) { if (RollupWarningIgnoreList.includes(warning.code!)) return onwarn(warning) } + +function getPkgDeps(root: string): string[] { + let pkg = null + try { + pkg = require(join(root, 'package.json')) + } catch { + // + } + let deps: string[] = [] + if (pkg) { + deps = [ + ...Object.keys(pkg?.dependencies || {}), + ...Object.keys(pkg?.peerDependencies || {}) + ] + } + return deps +} diff --git a/packages/plugin-cmd-roll-lib/src/plugins/css.ts b/packages/plugin-cmd-roll-lib/src/plugins/css.ts index e54a480..f4f6e57 100644 --- a/packages/plugin-cmd-roll-lib/src/plugins/css.ts +++ b/packages/plugin-cmd-roll-lib/src/plugins/css.ts @@ -41,7 +41,6 @@ export type IPreprocessorOps = Partial> interface ICssOps { injectScript?: boolean cssCodeSplit?: boolean - sourceMap?: boolean minify?: boolean // ops modules?: ICssModulesOps @@ -57,12 +56,8 @@ const commonjsProxyRE = /\?commonjs-proxy/ const cssCache = new Map() const opsToFullCssChunk = new WeakMap() export function cssPlugin(ops?: ICssOps): Plugin { - const { - cssCodeSplit = false, - injectScript = false, - sourceMap = false, - minify = false - } = ops || {} + const { cssCodeSplit = false, injectScript = false, minify = false } = + ops || {} let hasGenFullStyle = false return { name: 'xus:rollup:css', @@ -134,7 +129,7 @@ export function cssPlugin(ops?: ICssOps): Plugin { return { code: s.toString(), - map: sourceMap ? s.generateMap({ hires: true }) : undefined + map: ops.sourcemap ? s.generateMap({ hires: true }) : undefined } } else { // bundle a full css diff --git a/packages/plugin-cmd-roll-lib/src/plugins/esbuild.ts b/packages/plugin-cmd-roll-lib/src/plugins/esbuild.ts index 104d271..918dea7 100644 --- a/packages/plugin-cmd-roll-lib/src/plugins/esbuild.ts +++ b/packages/plugin-cmd-roll-lib/src/plugins/esbuild.ts @@ -36,6 +36,16 @@ export function esbuildPlugin(ops: IEsbuildOps = {}): Plugin { if (jsxInject && /\.(?:j|t)sx\b/.test(importer)) { res.code = jsxInject + ';' + res.code } + // log warn + logger.debug(`transform warnnings: `) + logger.debug(res.warnings) + let warnMsg = '' + res.warnings.forEach((w) => { + warnMsg += w.text + '\n' + }) + warnMsg && + logger.warn('esbuild transform ' + importer + ' warnning:' + warnMsg) + return { code: res.code, map: res.map @@ -64,8 +74,8 @@ export async function transformByEsbuild( ...ops, sourcefile: filename, loader, - sourcemap: true, - minify: false + minify: false, + sourcemap: true } try { logger.debug(`transform with options: `) @@ -74,21 +84,10 @@ export async function transformByEsbuild( source, transformOps ) - logger.debug(`transform code: `) - logger.debug(code) - logger.debug(`transform sourcemap: `) - logger.debug(map) - // log warn - logger.debug(`transform warnnings: `) - logger.debug(warnings) - let warnMsg = '' - warnings.forEach((w) => { - warnMsg += w.text + '\n' - }) - warnMsg && logger.warn('transform ' + filename + ' warnning:' + warnMsg) return { code, - map: map ? JSON.parse(map) : {} + warnings, + map: map ? JSON.parse(map) : { mappings: '' } } } catch (e) { logger.debug(`esbuild error: `) diff --git a/packages/plugin-cmd-roll-lib/src/plugins/minify.ts b/packages/plugin-cmd-roll-lib/src/plugins/minify.ts index 0e1d69d..6c82d8f 100644 --- a/packages/plugin-cmd-roll-lib/src/plugins/minify.ts +++ b/packages/plugin-cmd-roll-lib/src/plugins/minify.ts @@ -1,3 +1,4 @@ +import { Logger } from '@xus/cli-shared' import { Plugin } from 'rollup' import { TransformOptions } from 'esbuild' import { transformByEsbuild } from './esbuild' @@ -9,34 +10,55 @@ export interface IMinifyOps { terserMinifyOps?: MinifyOptions } -export function minifyPlugin(ops: IMinifyOps = {}): Plugin { +const logger = new Logger(`xus:rollup:minify`) + +export function minifyPlugin(ops?: IMinifyOps): Plugin { + const { minify = false, esbuildMinifyOps = {}, terserMinifyOps = {} } = + ops || {} + const isEsbuildMinify = minify === 'esbuild' return { name: 'xus:minify', async renderChunk(source, chunk, outputOps) { - switch (ops.minify) { - case false: - return null + logger.debug(`minify ${chunk.fileName} transformer ${minify}`) - case 'esbuild': - return await transformByEsbuild(source, chunk.fileName, { - ...ops.esbuildMinifyOps, - minify: true - }) + let code = source + let map = chunk.map + // when legacy mode skip esbuild handle use babel + // @ts-ignore + if (!outputOps?.__xus__skip__esbuild) { + // transform js, minify when minify === esbuild + logger.debug(`esbuild minify with `, { + ...esbuildMinifyOps, + minify: isEsbuildMinify + }) + const result = await transformByEsbuild(source, chunk.fileName, { + ...esbuildMinifyOps, + minify: isEsbuildMinify + }) + code = result.code + map = result.map + logger.debug(`esbuild minify warning `, result.warnings) + } - case 'terser': - // eslint-disable-next-line no-case-declarations - const res = await terser.minify(source, { - ...ops.terserMinifyOps, - module: outputOps.format.startsWith('es'), - toplevel: outputOps.format === 'cjs', - safari10: true - }) - return { - code: res.code as string, - map: res.map - } + if (minify === 'terser') { + // eslint-disable-next-line no-case-declarations + const res = await terser.minify(code, { + ...terserMinifyOps, + sourceMap: !!outputOps.sourcemap, + module: outputOps.format.startsWith('es'), + toplevel: outputOps.format === 'cjs', + safari10: true + }) + return { + code: res.code as string, + map: res.map + } + } else { + return { + code, + map + } } - return null } } } diff --git a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts index e39d290..9dca7f4 100644 --- a/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts +++ b/packages/plugin-cmd-roll-lib/src/resolveConfig/index.ts @@ -86,7 +86,8 @@ export async function generateBuildOps( if (rollupConfig) { api.logger.debug(`[generate buildOps] in ${pkgRoot}`) const { output, ...inputOps } = rollupConfig - + // TODO: support from rollup-chain + inputOps.preserveEntrySignatures = 'strict' // input to absolute if (!inputOps.input && !resolvedConfig.entry) { const fileMeta = diff --git a/packages/plugin-lib-legacy/src/index.ts b/packages/plugin-lib-legacy/src/index.ts index 25aaa53..57b6612 100644 --- a/packages/plugin-lib-legacy/src/index.ts +++ b/packages/plugin-lib-legacy/src/index.ts @@ -23,13 +23,6 @@ export default (ops?: ILegacyOps) => { api.modifyRollupConfig({ fn(rc) { - rc.plugin('$$esbuild').tap((ops) => { - // turn esbuild only handle .js/.ts/.tsx file - !ops[0] && (ops[0] = {}) - ops[0].exclude = /\.js$/ - ops[0].target = 'es2019' - return ops - }) // babel rc.plugin('$$legacy') .use(legacyPlugin, [ diff --git a/packages/plugin-lib-legacy/src/plugin.ts b/packages/plugin-lib-legacy/src/plugin.ts index a09ad41..9664f77 100644 --- a/packages/plugin-lib-legacy/src/plugin.ts +++ b/packages/plugin-lib-legacy/src/plugin.ts @@ -18,6 +18,9 @@ export function legacyPlugin(ops?: ILegacyPluginOps): Plugin { return { name: 'xus:rollup:legacy', async renderChunk(code, chunk, ops) { + // trun off esbuild transform .js file + // @ts-ignore + ops.__xus__skip__esbuild = true logger.debug(`transform ${chunk.facadeModuleId}`) const presets = [ [ diff --git a/packages/plugin-lib-vue-jsx/src/index.ts b/packages/plugin-lib-vue-jsx/src/index.ts index ddc3c14..91d591e 100644 --- a/packages/plugin-lib-vue-jsx/src/index.ts +++ b/packages/plugin-lib-vue-jsx/src/index.ts @@ -14,9 +14,9 @@ export default (ops?: IVueJsxOps) => { api.modifyRollupConfig({ fn(rc) { rc.plugin('$$esbuild').tap((ops) => { - // turn esbuild only handle .js file + // turn esbuild only handle .ts file !ops[0] && (ops[0] = {}) - ops[0].include = /\.(j|t)s$/ + ops[0].include = /\.ts$/ return ops }) // vue jsx transform