diff --git a/boilerplate/package.json b/boilerplate/package.json index eebbf672..75e4bde5 100644 --- a/boilerplate/package.json +++ b/boilerplate/package.json @@ -1,6 +1,6 @@ { "name": "create-father", - "version": "4.5.0", + "version": "4.5.1-beta.4", "description": "Creator for father boilerplate", "homepage": "https://github.com/umijs/father/tree/master/boilerplate#readme", "bugs": "https://github.com/umijs/father/issues", diff --git a/package.json b/package.json index 4beec2be..101a46e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "father", - "version": "4.5.0", + "version": "4.5.1-beta.4", "description": "A bundless/bundle build tool", "homepage": "https://github.com/umijs/father#readme", "bugs": "https://github.com/umijs/father/issues", @@ -43,12 +43,12 @@ }, "dependencies": { "@microsoft/api-extractor": "7.39.1", - "@umijs/babel-preset-umi": "^4.3.12", - "@umijs/bundler-utils": "^4.3.12", - "@umijs/bundler-webpack": "^4.3.12", + "@umijs/babel-preset-umi": "^4.3.15", + "@umijs/bundler-utils": "^4.3.15", + "@umijs/bundler-webpack": "^4.3.15", "@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1", - "@umijs/core": "^4.3.12", - "@umijs/utils": "^4.3.12", + "@umijs/core": "^4.3.15", + "@umijs/utils": "^4.3.15", "@vercel/ncc": "0.33.3", "babel-plugin-dynamic-import-node": "2.3.3", "babel-plugin-module-resolver": "4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbdd8bc8..db2e8538 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,23 +12,23 @@ importers: specifier: 7.39.1 version: 7.39.1(@types/node@18.15.13) '@umijs/babel-preset-umi': - specifier: ^4.3.12 - version: 4.3.12 + specifier: ^4.3.15 + version: 4.3.15 '@umijs/bundler-utils': - specifier: ^4.3.12 - version: 4.3.12 + specifier: ^4.3.15 + version: 4.3.15 '@umijs/bundler-webpack': - specifier: ^4.3.12 - version: 4.3.12(typescript@5.3.3)(webpack@5.80.0) + specifier: ^4.3.15 + version: 4.3.15(typescript@5.3.3)(webpack@5.80.0) '@umijs/case-sensitive-paths-webpack-plugin': specifier: ^1.0.1 version: 1.0.1 '@umijs/core': - specifier: ^4.3.12 - version: 4.3.12 + specifier: ^4.3.15 + version: 4.3.15 '@umijs/utils': - specifier: ^4.3.12 - version: 4.3.12 + specifier: ^4.3.15 + version: 4.3.15 '@vercel/ncc': specifier: 0.33.3 version: 0.33.3 @@ -3761,24 +3761,24 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@umijs/babel-preset-umi@4.3.12: - resolution: {integrity: sha512-aItA/OUu5/cMcTC/QXBGLtcInedOnF2pBc5YhoAgsMN+lpkO5v/8tByfohqXT5/2LVzNH7x/H8ALjZWjO+WOVQ==} + /@umijs/babel-preset-umi@4.3.15: + resolution: {integrity: sha512-/MHrPUUQzntcgBayYFGchtHnUaDYNhFCofp+DSIYJHkEI7jTyH/P5Jx3sdeYQSW+WotIl1jrigz4Z5x8Anu9mg==} dependencies: '@babel/runtime': 7.23.6 '@bloomberg/record-tuple-polyfill': 0.0.4 - '@umijs/bundler-utils': 4.3.12 - '@umijs/utils': 4.3.12 + '@umijs/bundler-utils': 4.3.15 + '@umijs/utils': 4.3.15 core-js: 3.34.0 transitivePeerDependencies: - supports-color dev: false - /@umijs/bundler-esbuild@4.3.12: - resolution: {integrity: sha512-docsxqwgxFMygpdosxI2mjL2sYuN7JBp7QcKD3qf/URrWOeo0lPq5Oi7YALrfVPEsHUimW7JVEYszCuo+U4//A==} + /@umijs/bundler-esbuild@4.3.15: + resolution: {integrity: sha512-C11IOdCXeJxYVHOehXp3eTFyegRjkSN5gVPaT6qylR5DkicKpNF/fQDQKDbWjq58up4vV9djy0+c+RxmCgNYGQ==} hasBin: true dependencies: - '@umijs/bundler-utils': 4.3.12 - '@umijs/utils': 4.3.12 + '@umijs/bundler-utils': 4.3.15 + '@umijs/utils': 4.3.15 enhanced-resolve: 5.9.3 postcss: 8.4.31 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.31) @@ -3799,10 +3799,10 @@ packages: - supports-color dev: true - /@umijs/bundler-utils@4.3.12: - resolution: {integrity: sha512-F9RjftHWtWgxrTBPpvzfqgAqsYHhgnPKQLFRokQzKaF+qPbK5CXj1DhePDWb9tFQxzKmkiCfzg419uVqjctloQ==} + /@umijs/bundler-utils@4.3.15: + resolution: {integrity: sha512-PY0dPOzLl2mIDL8luD/10X301R6mAP6vFOr4kXyR9wsze6ZfODxDpsnM2K+2K/EqFUgwXRLlVRLjEratGSQ0RQ==} dependencies: - '@umijs/utils': 4.3.12 + '@umijs/utils': 4.3.15 esbuild: 0.21.4 regenerate: 1.4.2 regenerate-unicode-properties: 10.1.1 @@ -3811,20 +3811,20 @@ packages: - supports-color dev: false - /@umijs/bundler-webpack@4.3.12(typescript@5.3.3)(webpack@5.80.0): - resolution: {integrity: sha512-WDLK2Y7arX+S60OO/p6pM4G+YcLidLOGbpGcvm5IHUcpMyJltPfLTN/xvVd+Gyn3TXxMaLA16BEiTDTUSrpohA==} + /@umijs/bundler-webpack@4.3.15(typescript@5.3.3)(webpack@5.80.0): + resolution: {integrity: sha512-sczSsOZKlRpHIJJApZLQTocPRJdYdFxmiQJkeY3SLwMZBYX7zRABHb+YTRGIdFbDXSlrKLAnUPrx6OHhxU/4fw==} hasBin: true dependencies: '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) '@types/hapi__joi': 17.1.9 - '@umijs/babel-preset-umi': 4.3.12 - '@umijs/bundler-utils': 4.3.12 + '@umijs/babel-preset-umi': 4.3.15 + '@umijs/bundler-utils': 4.3.15 '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/mfsu': 4.3.12 + '@umijs/mfsu': 4.3.15 '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(webpack@5.80.0) - '@umijs/utils': 4.3.12 + '@umijs/utils': 4.3.15 cors: 2.8.5 css-loader: 6.7.1(webpack@5.80.0) es5-imcompatible-versions: 0.1.80 @@ -3852,21 +3852,21 @@ packages: resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==} dev: false - /@umijs/core@4.3.12: - resolution: {integrity: sha512-PdrzIxpicKTN0jTqJ3Rl+BTVXP/gNIjy7+Sn/z3AgbgZek2EObPsV72sXvMbTzvqLL35XPdZF+Ci9CnLXVGZTQ==} + /@umijs/core@4.3.15: + resolution: {integrity: sha512-eV4kVdBDkFoJgRegLornPO5o4TMuidViLmjVTDA6/NrXTcFI4zqg/c7ZPAzWPNg2hkxu1/Np/GyBCOj0iIJQLA==} dependencies: - '@umijs/bundler-utils': 4.3.12 - '@umijs/utils': 4.3.12 + '@umijs/bundler-utils': 4.3.15 + '@umijs/utils': 4.3.15 transitivePeerDependencies: - supports-color dev: false - /@umijs/mfsu@4.3.12: - resolution: {integrity: sha512-yryvvFTpbqgkZtnzPzHQj4/kYkl0hTKUnDr7KY0qq212y8lnykFD/afsmSk5IX0TEeel2bwYZV4a5RUEq1ahOA==} + /@umijs/mfsu@4.3.15: + resolution: {integrity: sha512-0zJAfs67wqiRum7ZhxrjZGxDMlFUmJtySp+JaC5fuxwjuG1zOP7uUcEJo22nxL3iQ3JaepwLyqGdsUQerjoG4g==} dependencies: - '@umijs/bundler-esbuild': 4.3.12 - '@umijs/bundler-utils': 4.3.12 - '@umijs/utils': 4.3.12 + '@umijs/bundler-esbuild': 4.3.15 + '@umijs/bundler-utils': 4.3.15 + '@umijs/utils': 4.3.15 enhanced-resolve: 5.9.3 is-equal: 1.6.4 transitivePeerDependencies: @@ -3942,8 +3942,8 @@ packages: pino: 7.11.0 dev: true - /@umijs/utils@4.3.12: - resolution: {integrity: sha512-mq7zm9HEcOmnf7uaedZlu1pVL65FFPjTIuyY0RvggETaAwfoeYBwQQQktPS8icjbpWlf4pe14a2cT/emVXjweQ==} + /@umijs/utils@4.3.15: + resolution: {integrity: sha512-fME5A83n6PlHpyletK4KTP0pvgXOlxDsjf4JGYBbD+WgmjiwHqXdS76+gKNDAVC57lCuMXIR5DneL1rCyOBPJA==} dependencies: chokidar: 3.5.3 pino: 7.11.0 diff --git a/src/builder/bundle/index.ts b/src/builder/bundle/index.ts index 548a2d54..ce74506a 100644 --- a/src/builder/bundle/index.ts +++ b/src/builder/bundle/index.ts @@ -31,7 +31,9 @@ interface IBundleOpts { incremental?: boolean; } -function bundle(opts: Omit): Promise; +function bundle( + opts: Omit, +): Promise; function bundle(opts: IBundleOpts): Promise; async function bundle(opts: IBundleOpts): Promise { const enableCache = process.env.FATHER_CACHE !== 'none'; @@ -68,7 +70,6 @@ async function bundle(opts: IBundleOpts): Promise { devtool: config.sourcemap && 'source-map', externals: config.externals, outputPath: config.output.path, - // postcss config extraPostCSSPlugins, postcssLoader, @@ -80,7 +81,7 @@ async function bundle(opts: IBundleOpts): Promise { // compatible with IE11 by default targets: getBundleTargets(config), - jsMinifier: JSMinifier.terser, + jsMinifier: config.jsMinifier, cssMinifier: CSSMinifier.cssnano, extraBabelIncludes: [/node_modules/], @@ -165,21 +166,21 @@ async function bundle(opts: IBundleOpts): Promise { // enable webpack persistent cache ...(enableCache ? { - cache: { - buildDependencies: opts.buildDependencies, - }, - } + cache: { + buildDependencies: opts.buildDependencies, + }, + } : {}), // collect close handlers for watch mode ...(opts.watch ? { - onBuildComplete({ isFirstCompile, close }: any) { - if (isFirstCompile) closeHandlers.push(close); - // log for watch mode - else logStatus(); - }, - } + onBuildComplete({ isFirstCompile, close }: any) { + if (isFirstCompile) closeHandlers.push(close); + // log for watch mode + else logStatus(); + }, + } : {}), disableCopy: true, }); diff --git a/src/builder/config.ts b/src/builder/config.ts index 38bb47d0..8463b58b 100644 --- a/src/builder/config.ts +++ b/src/builder/config.ts @@ -1,4 +1,6 @@ +import { JSMinifier } from '@umijs/bundler-webpack/dist/types'; import { winPath } from '@umijs/utils'; +import assert from 'assert'; import { Minimatch } from 'minimatch'; import path from 'path'; import { loadConfig } from 'tsconfig-paths'; @@ -24,6 +26,7 @@ export interface IBundleConfig Omit { type: IFatherBuildTypes.BUNDLE; bundler: 'webpack'; + jsMinifier: JSMinifier; entry: string; output: { filename: string; @@ -111,55 +114,100 @@ export function normalizeUserConfig( const entryConfig = umd.entry; const output = typeof umd.output === 'object' ? umd.output : { path: umd.output }; - const bundleConfig: Omit = { - type: IFatherBuildTypes.BUNDLE, - bundler: 'webpack', - ...baseConfig, + const bundleConfig: Omit = + { + type: IFatherBuildTypes.BUNDLE, + bundler: 'webpack', + ...baseConfig, - // override base configs from umd config - ...umd, - - // generate default output - output: { - // default to generate filename from package name - filename: - output.filename || `${getAutoBundleFilename(pkg.name)}.min.js`, - // default to output dist - path: output.path || 'dist/umd', - }, - }; + // override base configs from umd config + ...umd, + }; if (typeof entryConfig === 'object') { - // extract multiple entries to single configs - Object.keys(entryConfig).forEach((entry) => { - const outputConfig = entryConfig[entry].output; + Object.entries(entryConfig).forEach(([entry, singleConfig]) => { + const outputConfig = singleConfig.output; + const entryOutput = typeof outputConfig === 'object' ? outputConfig : { path: outputConfig }; + assert( + !( + singleConfig.generateUnminified && + entryOutput.filename?.includes('.min') + ), + 'if set generateUnminified enabled, you need to delete ".min" in the output filename config', + ); - configs.push({ + const minifiedConfig = { ...bundleConfig, - - // override all configs from entry config - ...entryConfig[entry], + ...singleConfig, entry, - - // override output + jsMinifier: JSMinifier.terser, output: { - filename: - entryOutput.filename || `${path.parse(entry).name}.min.js`, - path: entryOutput.path || bundleConfig.output.path, + filename: entryOutput.filename + ? entryOutput.filename.replace( + /(\.js)?$/, + singleConfig.generateUnminified ? '.min.js' : '.js', + ) + : `${path.parse(entry).name}.min.js`, + path: entryOutput.path || output.path || 'dist/umd', }, - }); + }; + + if (singleConfig.generateUnminified) { + const unminifiedConfig = { + ...bundleConfig, + ...singleConfig, + entry, + jsMinifier: JSMinifier.none, + sourcemap: false, + output: { + filename: entryOutput.filename || `${path.parse(entry).name}.js`, + path: entryOutput.path || output.path || 'dist/umd', + }, + }; + configs.push(unminifiedConfig, minifiedConfig); + } else { + configs.push(minifiedConfig); + } }); } else { - // generate single entry to single config + const defaultEntry = entryConfig || 'src/index'; + const defaultFileName = getAutoBundleFilename(pkg.name); + if (umd.generateUnminified) { + assert( + !output.filename?.includes('.min'), + 'if set generateUnminified enabled, you need to delete ".min" in the output filename config', + ); + configs.push({ + ...bundleConfig, + entry: defaultEntry, + jsMinifier: JSMinifier.none, + sourcemap: false, + output: { + filename: output.filename + ? `${output.filename}` + : `${defaultFileName}.js`, + path: output.path || 'dist/umd', + }, + }); + } + configs.push({ ...bundleConfig, - - // default to bundle src/index - entry: entryConfig || 'src/index', + entry: defaultEntry, + jsMinifier: JSMinifier.terser, + output: { + filename: output.filename + ? output.filename.replace( + /(\.js)?$/, + umd.generateUnminified ? '.min.js' : '.js', + ) + : `${defaultFileName}.min.js`, + path: output.path || 'dist/umd', + }, }); } } diff --git a/src/features/configPlugins/schema.ts b/src/features/configPlugins/schema.ts index dc19d91b..1bfc9dd4 100644 --- a/src/features/configPlugins/schema.ts +++ b/src/features/configPlugins/schema.ts @@ -64,6 +64,7 @@ export function getSchemas(): Record any> { Joi.string(), Joi.array(), ), + generateUnminified: Joi.boolean().optional(), chainWebpack: Joi.function().optional(), extractCSS: Joi.boolean().optional(), name: Joi.string().optional(), diff --git a/src/types.ts b/src/types.ts index 8d8f2557..7de151e4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -221,6 +221,13 @@ export interface IFatherBundleConfig extends IFatherBaseConfig { * configure less variables */ theme?: Record; + + /** + * output unminified js file + * @default false + * @note When set to true, unminified js file will be generated in the same directory without sourcemap. + */ + generateUnminified?: boolean; } export interface IFatherPreBundleConfig {