From b7308f445e8cc409cd1016ae43cb2baaf554be4a Mon Sep 17 00:00:00 2001 From: qlin Date: Tue, 28 Apr 2026 20:45:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7vite8=20(#276)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qlin --- cliff.toml | 37 + package.json | 25 +- packages/builder-vite/package.json | 19 +- .../src/commands/build/getBuildConfig.ts | 10 - .../builder-vite/src/commands/dev/index.ts | 5 +- .../src/common/vite-plugin-html.ts | 12 +- .../builder-vite/src/features/viteAnalyze.ts | 11 +- packages/builder-webpack/package.json | 4 +- .../src/plugins/commands/dev/devServer.ts | 8 +- .../src/plugins/commands/dev/index.ts | 5 +- .../src/plugins/common/buildDevUtils.ts | 19 +- .../src/plugins/common/webpackConfig/index.ts | 2 +- .../src/utils/generateExports.ts | 5 +- packages/compiler/package.json | 3 + packages/compiler/src/config/index.ts | 11 +- .../compiler/src/config/utils/configUtils.ts | 6 +- packages/compiler/src/config/utils/isEqual.ts | 6 +- .../compiler/src/config/utils/mergeDefault.ts | 5 +- packages/compiler/src/service/getPaths.ts | 5 +- packages/compiler/src/service/index.ts | 9 +- packages/compiler/src/service/pluginAPI.ts | 3 +- .../compiler/src/service/utils/pluginUtils.ts | 8 +- packages/create-fes-app/package.json | 2 +- .../templates/app/h5/package.json | 2 +- .../templates/app/h5/src/app.ts | 2 +- .../templates/app/pc/package.json | 2 +- .../templates/app/pc/src/app.tsx | 2 +- packages/fes-template-vite/.fes.js | 2 +- packages/fes-template-vite/package.json | 2 +- .../fes-template-vite/src/locales/zh-CN.js | 3 +- packages/fes-template/.fes.js | 3 - packages/fes/package.json | 1 + packages/fes/src/cli.ts | 7 +- packages/fes/src/forkedDev.ts | 5 +- packages/plugin-access/package.json | 2 +- packages/plugin-access/src/index.ts | 2 +- packages/plugin-icon/package.json | 1 + packages/plugin-icon/src/index.ts | 4 +- packages/plugin-locale/package.json | 5 +- .../plugin-locale/src/runtime/locales.js.tpl | 2 +- packages/plugin-locale/src/utils/index.ts | 5 +- packages/plugin-locale/types.d.ts | 6 +- packages/plugin-model/package.json | 4 +- packages/plugin-model/src/index.ts | 5 +- packages/plugin-model/src/utils/getModels.ts | 9 +- packages/plugin-monaco-editor/package.json | 5 +- packages/plugin-monaco-editor/src/index.ts | 19 +- .../src/runtime/editor.tpl | 2 +- .../src/runtime/loader.tpl | 21 +- .../examples/webpack-main/src/pages/index.vue | 3 +- packages/plugin-qiankun/package.json | 6 +- packages/plugin-qiankun/src/main/index.ts | 2 +- .../src/main/runtime/MicroApp.tpl | 2 +- packages/plugin-qiankun/src/micro/index.ts | 40 +- .../src/micro/runtime/qiankunModel.tpl | 2 +- .../plugin-qiankun/src/vite-plugin/helper.ts | 31 + .../plugin-qiankun/src/vite-plugin/index.ts | 117 + packages/plugin-qiankun/tsup.config.ts | 1 + packages/plugin-swc/package.json | 10 +- packages/plugin-swc/src/index.ts | 2 +- packages/plugin-watermark/package.json | 2 +- packages/preset-built-in/package.json | 7 +- .../core/entry/getRootContainer.jsx.tpl | 3 +- .../src/plugins/core/route/index.ts | 13 +- .../src/plugins/features/mock.ts | 17 +- .../src/plugins/registerMethods.ts | 3 +- .../src/plugins/watch/watchMode.ts | 8 +- .../src/plugins/watch/watchPkg.ts | 6 +- .../src/utils/generateExports.ts | 5 +- packages/utils/package.json | 7 +- packages/utils/src/index.ts | 8 - packages/utils/src/logger.ts | 16 +- packages/utils/src/stringifyObjValue.ts | 4 +- pnpm-lock.yaml | 10310 ++++++++-------- 74 files changed, 5520 insertions(+), 5448 deletions(-) create mode 100644 cliff.toml create mode 100644 packages/plugin-qiankun/src/vite-plugin/helper.ts create mode 100644 packages/plugin-qiankun/src/vite-plugin/index.ts diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 00000000..0b5d4210 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,37 @@ +[changelog] +header = """ +# Changelog\n +""" +body = """ +{% if version %}\ +## [{{ version | trim_start_matches(pat="v") }}](https://github.com/WeBankFinTech/fes.js/compare/{{ previous.version }}...{{ version }}) ({{ timestamp | date(format="%Y-%m-%d") }}) +{% else %}\ +## [Unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} +### {{ group | upper_first }} +{% for commit in commits %} +* {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}](https://github.com/WeBankFinTech/fes.js/commit/{{ commit.id }})) +{% endfor %} +{% endfor %}\n +""" +trim = true + +[git] +conventional_commits = true +filter_unconventional = true +split_commits = false +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^perf", group = "Performance Improvements" }, + { message = "^doc", group = "Documentation" }, + { message = "^style", group = "Styles" }, + { message = "^refactor", group = "Code Refactoring" }, + { message = "^test", group = "Tests" }, + { message = "^chore", group = "Chores" }, + { message = "^revert", group = "Reverts" }, +] +filter_commits = false +tag_pattern = "v[0-9].*" +sort_tags = "newest" diff --git a/package.json b/package.json index ab73359b..aeb8fada 100644 --- a/package.json +++ b/package.json @@ -28,30 +28,28 @@ "docs:build-pages": "BASE=fes.js vitepress build docs", "test": "fes test", "lint": "eslint --ignore-pattern='templates'", - "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", + "changelog": "git-cliff -o CHANGELOG.md", "hooks:sync": "simple-git-hooks" }, "dependencies": { "consola": "^3.4.2", - "conventional-changelog-cli": "^5.0.0", - "execa": "^6.1.0", + "execa": "^9.6.1", "minimist": "^1.2.6", "picocolors": "^1.1.1", "semver": "^7.3.6", "tsup": "^8.5.0", - "turbo": "^2.5.6" + "turbo": "^2.9.6" }, "devDependencies": { - "@antfu/eslint-config": "^5.2.2", - "@commitlint/cli": "^18.4.4", - "@commitlint/config-conventional": "^18.4.4", - "chokidar": "^3.5.3", - "commitizen": "^4.3.1", - "cz-conventional-changelog": "^3.3.0", + "@antfu/eslint-config": "^8.2.0", + "@commitlint/cli": "^20.5.0", + "@commitlint/config-conventional": "^20.5.0", + "chokidar": "^5.0.0", "deepmerge": "^4.2.2", "eslint": "^9.34.0", "fs-extra": "^11.3.1", - "lint-staged": "^15.2.0", + "git-cliff": "^2.12.0", + "lint-staged": "^16.4.0", "simple-git-hooks": "^2.9.0", "typescript": "^5.9.2", "vitepress": "1.0.0-alpha.73", @@ -65,10 +63,5 @@ "*.{js,jsx,vue,ts}": [ "npm run lint" ] - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } } } diff --git a/packages/builder-vite/package.json b/packages/builder-vite/package.json index c17edd75..64b4d121 100644 --- a/packages/builder-vite/package.json +++ b/packages/builder-vite/package.json @@ -36,29 +36,30 @@ "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", - "@rollup/pluginutils": "^5.1.0", - "@vitejs/plugin-basic-ssl": "^2.1.0", - "@vitejs/plugin-legacy": "^7.2.1", - "@vitejs/plugin-vue": "^6.0.1", - "@vitejs/plugin-vue-jsx": "^5.1.1", + "@vitejs/plugin-basic-ssl": "^2.3.0", + "@vitejs/plugin-legacy": "^8.0.1", + "@vitejs/plugin-vue": "^6.0.6", + "@vitejs/plugin-vue-jsx": "^5.1.5", "autoprefixer": "^10.4.21", "colorette": "^2.0.16", "connect-history-api-fallback": "^2.0.0", "consola": "^3.4.2", "dotenv": "^16.0.0", "dotenv-expand": "^8.0.2", - "ejs": "^3.1.6", + "ejs": "^5.0.2", "fast-glob": "^3.2.11", "fs-extra": "^11.3.1", "html-minifier-terser": "^7.2.0", "less": "^4.2.0", + "minimatch": "^10.0.1", "node-html-parser": "^5.3.3", - "pathe": "^0.2.0", + "pathe": "^2.0.3", + "picocolors": "^1.1.1", "postcss-flexbugs-fixes": "^5.0.2", "postcss-safe-parser": "^6.0.0", - "rollup-plugin-visualizer": "^6.0.3", "terser": "^5.24.0", - "vite": "^7.1.4" + "vite": "^8.0.9", + "vite-bundle-analyzer": "^1.3.7" }, "typings": "./types.d.ts" } diff --git a/packages/builder-vite/src/commands/build/getBuildConfig.ts b/packages/builder-vite/src/commands/build/getBuildConfig.ts index 34febe8c..8eb956f4 100644 --- a/packages/builder-vite/src/commands/build/getBuildConfig.ts +++ b/packages/builder-vite/src/commands/build/getBuildConfig.ts @@ -7,16 +7,6 @@ import postcssFlexbugsFixes from 'postcss-flexbugs-fixes'; import postcssSafeParser from 'postcss-safe-parser'; import { getInnerCommonConfig } from '../../common/getConfig'; -function getEsbuildTarget(targets: any): string[] { - const result: string[] = []; - ['chrome', 'edge', 'firefox', 'hermes', 'ios', 'node', 'opera', 'rhino', 'safari'].forEach((key) => { - if (targets[key]) { - result.push(`${key}${targets[key]}`); - } - }); - return result; -} - export default async (api: IPluginAPI): Promise => { const { deepmerge, getTargetsAndBrowsersList } = api.utils; diff --git a/packages/builder-vite/src/commands/dev/index.ts b/packages/builder-vite/src/commands/dev/index.ts index b149ea5e..ade6ae01 100644 --- a/packages/builder-vite/src/commands/dev/index.ts +++ b/packages/builder-vite/src/commands/dev/index.ts @@ -2,6 +2,7 @@ import type { IPluginAPI } from '@fesjs/shared'; import type { ViteDevServer } from 'vite'; import process from 'node:process'; import { createServer } from 'vite'; +import pc from 'picocolors'; import getDevConfig from './getDevConfig'; interface Args { @@ -14,7 +15,7 @@ interface Args { export default (api: IPluginAPI) => { const { paths, - utils: { chalk, rimraf }, + utils: { rimraf }, } = api; let server: ViteDevServer | undefined; @@ -63,7 +64,7 @@ export default (api: IPluginAPI) => { name: 'restartServer', fn() { // eslint-disable-next-line no-console - console.log(chalk.gray('Try to restart dev server...')); + console.log(pc.gray('Try to restart dev server...')); destroy(); if (typeof process !== 'undefined' && process.send) { process.send({ diff --git a/packages/builder-vite/src/common/vite-plugin-html.ts b/packages/builder-vite/src/common/vite-plugin-html.ts index f426b015..0305ff1b 100644 --- a/packages/builder-vite/src/common/vite-plugin-html.ts +++ b/packages/builder-vite/src/common/vite-plugin-html.ts @@ -1,14 +1,14 @@ import type { ConfigEnv, Plugin, ResolvedConfig, ViteDevServer } from 'vite'; import process from 'node:process'; -import { createFilter } from '@rollup/pluginutils'; import { dim } from 'colorette'; import consola from 'consola'; import dotenv from 'dotenv'; import { expand } from 'dotenv-expand'; -import { render } from 'ejs'; +import ejs from 'ejs'; import fg from 'fast-glob'; import fse from 'fs-extra'; import { minify } from 'html-minifier-terser'; +import { minimatch } from 'minimatch'; import { parse } from 'node-html-parser'; import path, { dirname, join } from 'pathe'; import { normalizePath } from 'vite'; @@ -119,7 +119,7 @@ function createPlugin(userOptions: UserOptions = {}): Plugin { if (input) { return { build: { - rollupOptions: { + rolldownOptions: { input, }, }, @@ -271,7 +271,7 @@ async function renderHtml(html: string, config: any): Promise { ...(env || {}), ...data, }; - let result = await render(html, ejsData, ejsOptions); + let result = await ejs.render(html, ejsData, ejsOptions); if (entry) { result = removeEntryScript(result, verbose); result = result.replace(bodyInjectRE, ``); @@ -292,7 +292,7 @@ function getPage(userOptions: UserOptions, name: string, viteConfig: ResolvedCon } function isMpa(viteConfig: ResolvedConfig | undefined): boolean { - const input = viteConfig?.build?.rollupOptions?.input ?? undefined; + const input = viteConfig?.build?.rolldownOptions?.input ?? undefined; return typeof input !== 'string' && Object.keys(input || {}).length > 1; } @@ -352,7 +352,7 @@ function createRewire(reg: string, page: Page, baseUrl: string, proxyUrlKeys: st }; } -const htmlFilter = createFilter(['**/*.html']); +const htmlFilter = (id: string) => minimatch(id, '**/*.html'); function getOptions(_minify: boolean) { return { diff --git a/packages/builder-vite/src/features/viteAnalyze.ts b/packages/builder-vite/src/features/viteAnalyze.ts index 799b4c2f..742fadeb 100644 --- a/packages/builder-vite/src/features/viteAnalyze.ts +++ b/packages/builder-vite/src/features/viteAnalyze.ts @@ -1,6 +1,6 @@ import type { IPluginAPI } from '@fesjs/shared'; import process from 'node:process'; -import { visualizer } from 'rollup-plugin-visualizer'; +import { analyzer } from 'vite-bundle-analyzer'; export default (api: IPluginAPI<{ viteAnalyze: Record }>) => { api.describe({ @@ -16,11 +16,10 @@ export default (api: IPluginAPI<{ viteAnalyze: Record }>) => { api.modifyBundleConfig((memo: any) => { memo.plugins.push( - visualizer({ - filename: './.cache/visualizer/stats.html', - open: true, - gzipSize: true, - brotliSize: true, + analyzer({ + analyzerMode: 'static', + fileName: './.cache/visualizer/stats', + openAnalyzer: true, ...api.config.viteAnalyze, }), ); diff --git a/packages/builder-webpack/package.json b/packages/builder-webpack/package.json index 4eb163ce..d29c8fb3 100644 --- a/packages/builder-webpack/package.json +++ b/packages/builder-webpack/package.json @@ -44,7 +44,7 @@ "@babel/preset-typescript": "^7.27.1", "@fesjs/shared": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", - "@vue/babel-plugin-jsx": "^1.5.0", + "@vue/babel-plugin-jsx": "^2.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.14", "babel-loader": "^10.0.0", @@ -54,6 +54,7 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^5.0.0", + "es-toolkit": "^1.46.0", "fs-extra": "^11.3.1", "get-folder-size": "^5.0.0", "html-webpack-plugin": "^5.5.0", @@ -61,6 +62,7 @@ "less": "^4.1.3", "less-loader": "^11.1.0", "mini-css-extract-plugin": "^2.9.4", + "picocolors": "^1.1.1", "postcss": "^8.4.33", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^7.1.0", diff --git a/packages/builder-webpack/src/plugins/commands/dev/devServer.ts b/packages/builder-webpack/src/plugins/commands/dev/devServer.ts index 9a8d2e3a..cc0dd798 100644 --- a/packages/builder-webpack/src/plugins/commands/dev/devServer.ts +++ b/packages/builder-webpack/src/plugins/commands/dev/devServer.ts @@ -1,5 +1,5 @@ import type { WebpackBuildConfig } from '../../../shared'; -import { chalk } from '@fesjs/utils'; +import pc from 'picocolors'; import webpack from 'webpack'; import WebpackDevServer from 'webpack-dev-server'; @@ -68,13 +68,13 @@ export function startDevServer({ webpackConfig, host, port, proxy, https, before const server = new WebpackDevServer(options, compiler); if (options.host === '0.0.0.0') { // eslint-disable-next-line no-console - console.log(chalk.green(' ➜ Local: '), chalk.cyan(`${options.server}://127.0.0.1:${options.port}`)); + console.log(pc.green(' ➜ Local: '), pc.cyan(`${options.server}://127.0.0.1:${options.port}`)); // eslint-disable-next-line no-console - console.log(chalk.gray(' ➜ Network: '), chalk.gray(`${options.server}://${options.host}:${options.port}`)); + console.log(pc.gray(' ➜ Network: '), pc.gray(`${options.server}://${options.host}:${options.port}`)); } else { // eslint-disable-next-line no-console - console.log(chalk.green(' ➜ :Local: '), chalk.cyan(`${options.server}://${options.host}:${options.port}`)); + console.log(pc.green(' ➜ :Local: '), pc.cyan(`${options.server}://${options.host}:${options.port}`)); } server.startCallback((err) => { if (err) { diff --git a/packages/builder-webpack/src/plugins/commands/dev/index.ts b/packages/builder-webpack/src/plugins/commands/dev/index.ts index 668e0d03..8424bee9 100644 --- a/packages/builder-webpack/src/plugins/commands/dev/index.ts +++ b/packages/builder-webpack/src/plugins/commands/dev/index.ts @@ -5,6 +5,7 @@ import path from 'node:path'; import process from 'node:process'; import { removeSync } from 'fs-extra/esm'; import getFolderSize from 'get-folder-size'; +import pc from 'picocolors'; import { cleanTmpPathExceptCache, getBundleAndConfigs } from '../../common/buildDevUtils'; import connectHistoryMiddleware from './connectHistoryMiddleware'; import { startDevServer } from './devServer'; @@ -29,7 +30,7 @@ async function handleCacheClean(cwd: string) { export default (api: IPluginAPI) => { const { paths, - utils: { chalk, getPort, getHostName, changePort, logger }, + utils: { getPort, getHostName, changePort, logger }, } = api; let port: number; @@ -112,7 +113,7 @@ export default (api: IPluginAPI) => { api.registerMethod({ name: 'restartServer', fn() { - logger.info(chalk.gray('Try to restart dev server...')); + logger.info(pc.gray('Try to restart dev server...')); destroy(); process.send?.({ type: 'RESTART', diff --git a/packages/builder-webpack/src/plugins/common/buildDevUtils.ts b/packages/builder-webpack/src/plugins/common/buildDevUtils.ts index 1cc1ec8a..42692bbc 100644 --- a/packages/builder-webpack/src/plugins/common/buildDevUtils.ts +++ b/packages/builder-webpack/src/plugins/common/buildDevUtils.ts @@ -4,7 +4,8 @@ import type { WebpackBuildConfig } from '../../shared'; import { existsSync, readFileSync } from 'node:fs'; import { join, resolve } from 'node:path'; import zlib from 'node:zlib'; -import { chalk, rimraf } from '@fesjs/utils'; +import { rimraf } from '@fesjs/utils'; +import pc from 'picocolors'; import UI from 'cliui'; import getConfig from './webpackConfig'; @@ -168,14 +169,14 @@ export function printFileSizes({ stats, dir }: PrintFileSizesOptions) { } ui.div( - `${makeRow(chalk.cyan.bold('File'), chalk.cyan.bold('Size'), chalk.cyan.bold('Gzipped'))}\n\n${orderedAssets + `${makeRow(pc.cyan(pc.bold('File')), pc.cyan(pc.bold('Size')), pc.cyan(pc.bold('Gzipped')))}\n\n${orderedAssets .map((asset: any) => makeRow( asset.name.endsWith('js') ? asset.suggested - ? chalk.yellow(join(dir, asset.name)) - : chalk.green(join(dir, asset.name)) - : chalk.blue(join(dir, asset.name)), + ? pc.yellow(join(dir, asset.name)) + : pc.green(join(dir, asset.name)) + : pc.blue(join(dir, asset.name)), filesize(asset.size), getGzippedSize(asset), ), @@ -184,17 +185,17 @@ export function printFileSizes({ stats, dir }: PrintFileSizesOptions) { ); // eslint-disable-next-line no-console - console.log(`${ui.toString()}\n\n ${chalk.gray('Images and other types of assets omitted.')}\n`); + console.log(`${ui.toString()}\n\n ${pc.gray('Images and other types of assets omitted.')}\n`); if (orderedAssets?.some((asset: any) => asset.suggested)) { // eslint-disable-next-line no-console console.log(); // eslint-disable-next-line no-console - console.log(chalk.yellow('The bundle size is significantly larger than recommended.')); + console.log(pc.yellow('The bundle size is significantly larger than recommended.')); // eslint-disable-next-line no-console - console.log(chalk.yellow('Consider reducing it with code splitting')); + console.log(pc.yellow('Consider reducing it with code splitting')); // eslint-disable-next-line no-console - console.log(chalk.yellow('You can also analyze the project dependencies using ANALYZE=1')); + console.log(pc.yellow('You can also analyze the project dependencies using ANALYZE=1')); // eslint-disable-next-line no-console console.log(); } diff --git a/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts b/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts index 8ae25537..5e40400c 100644 --- a/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts @@ -21,7 +21,7 @@ const DEFAULT_EXCLUDE_NODE_MODULES = [ 'core-js', 'echarts', '@babel/runtime', - 'lodash-es', + 'es-toolkit', 'webpack-dev-server', 'ansi-html', 'html-entities', diff --git a/packages/builder-webpack/src/utils/generateExports.ts b/packages/builder-webpack/src/utils/generateExports.ts index bf083e91..a0c88f14 100644 --- a/packages/builder-webpack/src/utils/generateExports.ts +++ b/packages/builder-webpack/src/utils/generateExports.ts @@ -1,6 +1,7 @@ import assert from 'node:assert'; import path from 'node:path'; -import { lodash, winPath } from '@fesjs/utils'; +import { winPath } from '@fesjs/utils'; +import { isPlainObject } from 'es-toolkit/compat'; interface SpecifierObject { local: string; @@ -40,7 +41,7 @@ export default function generateExports(basePath: string, { item, fesExportsHook fesExportsHook[specifier] = true; return specifier; } - assert(lodash.isPlainObject(specifier), `Configure item context should be Plain Object, but got ${specifier}.`); + assert(isPlainObject(specifier), `Configure item context should be Plain Object, but got ${specifier}.`); assert((specifier as SpecifierObject).local && (specifier as SpecifierObject).exported, 'local and exported should be supplied.'); return `${(specifier as SpecifierObject).local} as ${(specifier as SpecifierObject).exported}`; }); diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 2ea0e721..8135293f 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -33,11 +33,14 @@ "@babel/core": "^7.28.3", "@babel/preset-env": "^7.28.3", "@fesjs/utils": "^4.0.0-beta.0", + "chokidar": "^5.0.0", "commander": "^7.0.0", "dotenv": "8.2.0", + "es-toolkit": "^1.46.0", "fs-extra": "^11.3.1", "joi": "17.3.0", "package-up": "^5.0.0", + "picocolors": "^1.1.1", "tapable": "^2.2.0" }, "devDependencies": { diff --git a/packages/compiler/src/config/index.ts b/packages/compiler/src/config/index.ts index faa12330..418e9405 100644 --- a/packages/compiler/src/config/index.ts +++ b/packages/compiler/src/config/index.ts @@ -4,8 +4,11 @@ import { existsSync } from 'node:fs'; import { extname, join } from 'node:path'; import process from 'node:process'; import { pathToFileURL } from 'node:url'; -import { chalk, chokidar, compatESModuleRequire, deepmerge, lodash, winPath } from '@fesjs/utils'; +import { compatESModuleRequire, deepmerge, winPath } from '@fesjs/utils'; +import * as chokidar from 'chokidar'; +import { clone, difference } from 'es-toolkit/compat'; import joi from 'joi'; +import pc from 'picocolors'; import { ServiceStage } from '../service/enums'; import { getUserConfigWithKey, updateUserConfigWithKey } from './utils/configUtils'; import isEqual from './utils/isEqual'; @@ -185,7 +188,7 @@ export default class Config { getWatchFilesAndDirectories(): string[] { const fesEnv = process.env.FES_ENV; - const configFiles = lodash.clone(CONFIG_FILES); + const configFiles = clone(CONFIG_FILES); CONFIG_FILES.forEach((f) => { if (this.localConfig) { configFiles.push(this.addAffix(f, 'local')); @@ -217,9 +220,9 @@ export default class Config { }); watcher.on('all', async (event, path) => { // eslint-disable-next-line no-console - console.log(chalk.green(`[${event}] ${path}`)); + console.log(pc.green(`[${event}] ${path}`)); const newPaths = this.getWatchFilesAndDirectories(); - const diffs = lodash.difference(newPaths, paths); + const diffs = difference(newPaths, paths); if (diffs.length) { watcher.add(diffs); paths = paths.concat(diffs); diff --git a/packages/compiler/src/config/utils/configUtils.ts b/packages/compiler/src/config/utils/configUtils.ts index d649ad75..b9bb4120 100644 --- a/packages/compiler/src/config/utils/configUtils.ts +++ b/packages/compiler/src/config/utils/configUtils.ts @@ -1,5 +1,5 @@ import type { UserConfig } from '../../types'; -import { lodash } from '@fesjs/utils'; +import { set, get } from 'es-toolkit/compat'; interface UpdateUserConfigWithKeyOptions { key: string; @@ -17,12 +17,12 @@ export function updateUserConfigWithKey({ value, userConfig, }: UpdateUserConfigWithKeyOptions): void { - lodash.set(userConfig, key, value); + set(userConfig, key, value); } export function getUserConfigWithKey({ key, userConfig, }: GetUserConfigWithKeyOptions): any { - return lodash.get(userConfig, key); + return get(userConfig, key); } diff --git a/packages/compiler/src/config/utils/isEqual.ts b/packages/compiler/src/config/utils/isEqual.ts index 94147aba..9398d2a3 100644 --- a/packages/compiler/src/config/utils/isEqual.ts +++ b/packages/compiler/src/config/utils/isEqual.ts @@ -1,10 +1,10 @@ -import { lodash } from '@fesjs/utils'; +import { isPlainObject, isEqual as deepIsEqual } from 'es-toolkit/compat'; function funcToStr(obj: any): any { if (typeof obj === 'function') { return obj.toString(); } - if (lodash.isPlainObject(obj)) { + if (isPlainObject(obj)) { return Object.keys(obj).reduce((memo: Record, key: string) => { memo[key] = funcToStr(obj[key]); return memo; @@ -14,5 +14,5 @@ function funcToStr(obj: any): any { } export default function isEqual(a: any, b: any): boolean { - return lodash.isEqual(funcToStr(a), funcToStr(b)); + return deepIsEqual(funcToStr(a), funcToStr(b)); } diff --git a/packages/compiler/src/config/utils/mergeDefault.ts b/packages/compiler/src/config/utils/mergeDefault.ts index 56f6a9d7..3f0cc17e 100644 --- a/packages/compiler/src/config/utils/mergeDefault.ts +++ b/packages/compiler/src/config/utils/mergeDefault.ts @@ -1,4 +1,5 @@ -import { deepmerge, lodash } from '@fesjs/utils'; +import { deepmerge } from '@fesjs/utils'; +import { isPlainObject } from 'es-toolkit/compat'; interface MergeDefaultOptions { defaultConfig: any; @@ -6,7 +7,7 @@ interface MergeDefaultOptions { } export default function mergeDefault({ defaultConfig, config }: MergeDefaultOptions): any { - if (lodash.isPlainObject(defaultConfig) && lodash.isPlainObject(config)) { + if (isPlainObject(defaultConfig) && isPlainObject(config)) { return deepmerge(defaultConfig, config); } return typeof config !== 'undefined' ? config : defaultConfig; diff --git a/packages/compiler/src/service/getPaths.ts b/packages/compiler/src/service/getPaths.ts index 367f83e8..3962782e 100644 --- a/packages/compiler/src/service/getPaths.ts +++ b/packages/compiler/src/service/getPaths.ts @@ -1,7 +1,8 @@ import type { Paths, UserConfig } from '../types'; import { existsSync, statSync } from 'node:fs'; import { join } from 'node:path'; -import { lodash, winPath } from '@fesjs/utils'; +import { winPath } from '@fesjs/utils'; +import { mapValues } from 'es-toolkit/compat'; interface GetServicePathsOptions { cwd: string; @@ -14,7 +15,7 @@ function isDirectoryAndExist(path: string): boolean { } function normalizeWithWinPath(obj: Record): Record { - return lodash.mapValues(obj, value => winPath(value)); + return mapValues(obj, value => winPath(value)); } export default function getServicePaths({ cwd, config, env }: GetServicePathsOptions): Paths { diff --git a/packages/compiler/src/service/index.ts b/packages/compiler/src/service/index.ts index 17ec696b..11a0d943 100644 --- a/packages/compiler/src/service/index.ts +++ b/packages/compiler/src/service/index.ts @@ -15,7 +15,8 @@ import { EventEmitter } from 'node:events'; import { existsSync } from 'node:fs'; import { join } from 'node:path'; import process from 'node:process'; -import { chalk, lodash } from '@fesjs/utils'; +import pc from 'picocolors'; +import { clone } from 'es-toolkit/compat'; import { Command, Option } from 'commander'; import { readJSONSync } from 'fs-extra/esm'; import { AsyncSeriesWaterfallHook } from 'tapable'; @@ -375,7 +376,7 @@ export default class Service extends EventEmitter { } // 深度优先 - const extraPresets = lodash.clone(this._extraPresets); + const extraPresets = clone(this._extraPresets); this._extraPresets = []; while (extraPresets.length) { await this.initPreset(extraPresets.shift()!); @@ -542,7 +543,7 @@ export default class Service extends EventEmitter { command .usage(' [options]') .version(`@fesjs/fes ${this.fesPkg.version || ''}`, '-v, --vers', 'output the current version') - .description(chalk.cyan('一个好用的前端应用解决方案')); + .description(pc.cyan('一个好用的前端应用解决方案')); return command; } @@ -599,7 +600,7 @@ export default class Service extends EventEmitter { // eslint-disable-next-line no-console console.log(); // eslint-disable-next-line no-console - console.log(` Run ${chalk.cyan('fes --help')} for detailed usage of given command.`); + console.log(` Run ${pc.cyan('fes --help')} for detailed usage of given command.`); // eslint-disable-next-line no-console console.log(); }); diff --git a/packages/compiler/src/service/pluginAPI.ts b/packages/compiler/src/service/pluginAPI.ts index c4e8d88f..aab85333 100644 --- a/packages/compiler/src/service/pluginAPI.ts +++ b/packages/compiler/src/service/pluginAPI.ts @@ -7,6 +7,7 @@ import type { } from '../types'; import assert from 'node:assert'; import * as utils from '@fesjs/utils'; +import { isPlainObject } from 'es-toolkit/compat'; import { EnableBy, PluginType, ServiceStage } from './enums'; import { isValidPlugin, pathToObj } from './utils/pluginUtils'; @@ -135,7 +136,7 @@ export default class PluginAPI { || function (hookFn: any) { const hook: Partial = { key: name, - ...(utils.lodash.isPlainObject(hookFn) ? hookFn : { fn: hookFn }), + ...(isPlainObject(hookFn) ? hookFn : { fn: hookFn }), }; // @ts-expect-error this this.register(hook as Hook); diff --git a/packages/compiler/src/service/utils/pluginUtils.ts b/packages/compiler/src/service/utils/pluginUtils.ts index c507b204..444478e2 100644 --- a/packages/compiler/src/service/utils/pluginUtils.ts +++ b/packages/compiler/src/service/utils/pluginUtils.ts @@ -2,7 +2,9 @@ import type { Plugin } from '../../types'; import { basename, dirname, extname, join, relative } from 'node:path'; import process from 'node:process'; import { pathToFileURL } from 'node:url'; -import { chalk, compatESModuleRequire, lodash, resolve, winPath } from '@fesjs/utils'; +import { compatESModuleRequire, resolve, winPath } from '@fesjs/utils'; +import pc from 'picocolors'; +import { camelCase } from 'es-toolkit/compat'; import { readJSONSync } from 'fs-extra/esm'; import { packageUp } from 'package-up'; import { OWNER_DIR } from '../../shared'; @@ -72,7 +74,7 @@ function filterBuilder(opts: FilterBuilderOptions): string[] { .filter(builder => builder.includes(opts.builder || '')); if (builders.length > 1) { // eslint-disable-next-line no-console - console.log(chalk.yellow(`提示:您使用了多个builder,默认使用第一个${builders[0]}`)); + console.log(pc.yellow(`提示:您使用了多个builder,默认使用第一个${builders[0]}`)); return [builders[0]]; } return builders; @@ -115,7 +117,7 @@ export function getPluginsOrPresets(type: PluginType, opts: GetPluginsOrPresetsO function nameToKey(name: string): string { return name .split('.') - .map(part => lodash.camelCase(part)) + .map(part => camelCase(part)) .join('.'); } diff --git a/packages/create-fes-app/package.json b/packages/create-fes-app/package.json index 2655becb..13a6df47 100644 --- a/packages/create-fes-app/package.json +++ b/packages/create-fes-app/package.json @@ -38,7 +38,7 @@ "citty": "^0.1.6", "consola": "^3.4.2", "fs-extra": "^11.3.1", - "glob": "^11.0.3", + "glob": "^13.0.6", "mustache": "^4.2.0", "ora": "^8.2.0", "semver": "^7.7.2", diff --git a/packages/create-fes-app/templates/app/h5/package.json b/packages/create-fes-app/templates/app/h5/package.json index 70d89ab3..26438be8 100644 --- a/packages/create-fes-app/templates/app/h5/package.json +++ b/packages/create-fes-app/templates/app/h5/package.json @@ -17,7 +17,7 @@ "@fesjs/plugin-icon": "^5.0.0", "@fesjs/plugin-request": "^5.0.0", "core-js": "^3.43.0", - "lodash-es": "^4.17.21", + "es-toolkit": "^1.46.0", "vue": "^3.5.17" }, "devDependencies": { diff --git a/packages/create-fes-app/templates/app/h5/src/app.ts b/packages/create-fes-app/templates/app/h5/src/app.ts index 74221d99..5bd06492 100644 --- a/packages/create-fes-app/templates/app/h5/src/app.ts +++ b/packages/create-fes-app/templates/app/h5/src/app.ts @@ -1,5 +1,5 @@ import { defineRuntimeConfig } from '@fesjs/fes' -import { isPlainObject } from 'lodash-es' +import { isPlainObject } from 'es-toolkit/compat' export default defineRuntimeConfig({ request: { diff --git a/packages/create-fes-app/templates/app/pc/package.json b/packages/create-fes-app/templates/app/pc/package.json index b00f36b8..cf5d9525 100644 --- a/packages/create-fes-app/templates/app/pc/package.json +++ b/packages/create-fes-app/templates/app/pc/package.json @@ -22,7 +22,7 @@ "@fesjs/plugin-layout": "^6.0.0", "@fesjs/plugin-model": "^4.0.0", "core-js": "^3.43.0", - "lodash-es": "^4.17.21", + "es-toolkit": "^1.46.0", "vue": "^3.5.17" }, "devDependencies": { diff --git a/packages/create-fes-app/templates/app/pc/src/app.tsx b/packages/create-fes-app/templates/app/pc/src/app.tsx index d6818f42..8950a938 100644 --- a/packages/create-fes-app/templates/app/pc/src/app.tsx +++ b/packages/create-fes-app/templates/app/pc/src/app.tsx @@ -1,5 +1,5 @@ import { access, defineRuntimeConfig } from '@fesjs/fes' -import { isPlainObject } from 'lodash-es' +import { isPlainObject } from 'es-toolkit/compat' import PageLoading from '@/components/pageLoading.vue' import UserCenter from '@/components/userCenter.vue' diff --git a/packages/fes-template-vite/.fes.js b/packages/fes-template-vite/.fes.js index 413c051a..388e937b 100644 --- a/packages/fes-template-vite/.fes.js +++ b/packages/fes-template-vite/.fes.js @@ -7,7 +7,7 @@ export default defineBuildConfig({ __DEV__: false, }, publicPath: './', - title: '海贼王', + title: '歌者', router: { mode: 'hash', }, diff --git a/packages/fes-template-vite/package.json b/packages/fes-template-vite/package.json index 2a49b2a6..1a3d53f7 100644 --- a/packages/fes-template-vite/package.json +++ b/packages/fes-template-vite/package.json @@ -28,7 +28,7 @@ "@fesjs/plugin-monaco-editor": "workspace:*", "@fesjs/plugin-pinia": "workspace:*", "@fesjs/plugin-request": "workspace:*", - "@tailwindcss/vite": "^4.1.12", + "@tailwindcss/vite": "^4.2.4", "core-js": "^3.45.1", "pinia": "^3.0.3", "tailwindcss": "^4.1.12", diff --git a/packages/fes-template-vite/src/locales/zh-CN.js b/packages/fes-template-vite/src/locales/zh-CN.js index 55fc4666..af73a4fe 100644 --- a/packages/fes-template-vite/src/locales/zh-CN.js +++ b/packages/fes-template-vite/src/locales/zh-CN.js @@ -1,8 +1,7 @@ - export default { home: '首页', store: '状态管理', editor: '编辑器', externalLink: '外部链接', - mock: '代理' + mock: '代理', }; diff --git a/packages/fes-template/.fes.js b/packages/fes-template/.fes.js index 9efda3fc..dd96a1e7 100644 --- a/packages/fes-template/.fes.js +++ b/packages/fes-template/.fes.js @@ -11,9 +11,6 @@ export default defineBuildConfig({ console: { version: true, }, - html: { - title: '海贼王', - }, router: { mode: 'hash', }, diff --git a/packages/fes/package.json b/packages/fes/package.json index f12ec083..8efb6678 100644 --- a/packages/fes/package.json +++ b/packages/fes/package.json @@ -54,6 +54,7 @@ "@fesjs/preset-built-in": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", "fs-extra": "^11.3.1", + "picocolors": "^1.1.1", "vue-router": "^4.5.1" }, "devDependencies": { diff --git a/packages/fes/src/cli.ts b/packages/fes/src/cli.ts index 24b36e3f..c4a957b8 100644 --- a/packages/fes/src/cli.ts +++ b/packages/fes/src/cli.ts @@ -1,7 +1,8 @@ import type { CliArgs } from './types'; import { join } from 'node:path'; import process from 'node:process'; -import { chalk, semver, yParser } from '@fesjs/utils'; +import pc from 'picocolors'; +import { semver, yParser } from '@fesjs/utils'; import fesPkg from '../package.json'; import { Service } from './serviceWithBuiltIn'; import fork from './utils/fork'; @@ -13,7 +14,7 @@ const requiredVersion = fesPkg.engines.node; function checkNodeVersion(wanted: string, id: string): void { if (!semver.satisfies(process.version, wanted, { includePrerelease: true })) { - console.log(chalk.red(`You are using Node ${process.version}, but this version of ${id} requires Node ${wanted}.\nPlease upgrade your Node version.`)); + console.log(pc.red(`You are using Node ${process.version}, but this version of ${id} requires Node ${wanted}.\nPlease upgrade your Node version.`)); process.exit(1); } } @@ -58,7 +59,7 @@ export async function main(): Promise { } } catch (e: any) { - console.error(chalk.red(e.message)); + console.error(pc.red(e.message)); console.error(e.stack); process.exit(1); } diff --git a/packages/fes/src/forkedDev.ts b/packages/fes/src/forkedDev.ts index de8add09..9dcc3803 100644 --- a/packages/fes/src/forkedDev.ts +++ b/packages/fes/src/forkedDev.ts @@ -1,7 +1,8 @@ import type { ServiceInstance } from '@fesjs/compiler'; import type { DevArgs } from './types'; import process from 'node:process'; -import { chalk, yParser } from '@fesjs/utils'; +import pc from 'picocolors'; +import { yParser } from '@fesjs/utils'; import fesPkg from '../package.json'; import { Service } from './serviceWithBuiltIn'; import getCwd from './utils/getCwd'; @@ -48,7 +49,7 @@ function onSignal(signal: string, service: ServiceInstance): void { process.once('SIGTERM', () => onSignal('SIGTERM', service)); } catch (e: any) { - console.error(chalk.red(e.message)); + console.error(pc.red(e.message)); console.error(e.stack); process.exit(1); } diff --git a/packages/plugin-access/package.json b/packages/plugin-access/package.json index 88f4fa6f..6d69bc69 100644 --- a/packages/plugin-access/package.json +++ b/packages/plugin-access/package.json @@ -37,7 +37,7 @@ "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", - "lodash-es": "^4.17.21" + "es-toolkit": "^1.46.0" }, "typings": "./types.d.ts" } diff --git a/packages/plugin-access/src/index.ts b/packages/plugin-access/src/index.ts index 9013fceb..9ee1c193 100644 --- a/packages/plugin-access/src/index.ts +++ b/packages/plugin-access/src/index.ts @@ -39,7 +39,7 @@ export default (api: IPluginAPI) => { path: absoluteFilePath, content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), { REPLACE_ROLES: JSON.stringify(roles), - lodashPath: 'lodash-es', + lodashPath: 'es-toolkit/compat', }), }); diff --git a/packages/plugin-icon/package.json b/packages/plugin-icon/package.json index 7ffaa9a1..3a834035 100644 --- a/packages/plugin-icon/package.json +++ b/packages/plugin-icon/package.json @@ -35,6 +35,7 @@ }, "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", + "glob": "^13.0.6", "svgo": "^4.0.0" }, "typings": "./types.d.ts" diff --git a/packages/plugin-icon/src/index.ts b/packages/plugin-icon/src/index.ts index f0ec208d..2d11b727 100644 --- a/packages/plugin-icon/src/index.ts +++ b/packages/plugin-icon/src/index.ts @@ -2,6 +2,7 @@ import type { IPluginAPI } from '@fesjs/shared'; import { readFileSync } from 'node:fs'; import { basename, dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { globSync } from 'glob'; import optimizeSvg from './optimizeSvg'; const __filename = fileURLToPath(import.meta.url); @@ -28,7 +29,8 @@ export default (api: IPluginAPI) => { let generatedOnce = false; api.onGenerateFiles(async () => { const base = join(api.paths.absSrcPath, 'icons'); - const iconFiles = api.utils.glob.sync('**/*', { + const iconFiles = globSync('**/*', { + cwd: join(api.paths.absSrcPath, 'icons'), }); const svgDatas = await optimizeSvg(iconFiles.map(item => join(base, item))); diff --git a/packages/plugin-locale/package.json b/packages/plugin-locale/package.json index 02ded991..45f05a5e 100644 --- a/packages/plugin-locale/package.json +++ b/packages/plugin-locale/package.json @@ -37,8 +37,9 @@ "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", - "lodash-es": "^4.17.21", - "vue-i18n": "^9.0.0" + "glob": "^13.0.6", + "es-toolkit": "^1.46.0", + "vue-i18n": "^11.3.2" }, "typings": "./types.d.ts" } diff --git a/packages/plugin-locale/src/runtime/locales.js.tpl b/packages/plugin-locale/src/runtime/locales.js.tpl index 33bae548..c80425c8 100644 --- a/packages/plugin-locale/src/runtime/locales.js.tpl +++ b/packages/plugin-locale/src/runtime/locales.js.tpl @@ -1,4 +1,4 @@ -import { merge } from 'lodash-es' +import { merge } from 'es-toolkit/compat' {{#REPLACE_IMPORTS}} import {{importName}} from "{{{path}}}"; {{/REPLACE_IMPORTS}} diff --git a/packages/plugin-locale/src/utils/index.ts b/packages/plugin-locale/src/utils/index.ts index 6818f945..2d76d08f 100644 --- a/packages/plugin-locale/src/utils/index.ts +++ b/packages/plugin-locale/src/utils/index.ts @@ -1,5 +1,6 @@ import { basename, join } from 'node:path'; -import { glob, winPath } from '@fesjs/utils'; +import { globSync } from 'glob'; +import { winPath } from '@fesjs/utils'; const ignore = /\.(d\.ts|\.test\.(js|ts))$/; @@ -19,7 +20,7 @@ export function getLocales(cwdArray) { const map = {}; const files = []; cwdArray.forEach((cwd) => { - glob.sync('**/*.js', { + globSync('**/*.js', { cwd, }) .filter(file => !ignore.test(file)) diff --git a/packages/plugin-locale/types.d.ts b/packages/plugin-locale/types.d.ts index cef5d9bf..74fa5e37 100644 --- a/packages/plugin-locale/types.d.ts +++ b/packages/plugin-locale/types.d.ts @@ -1,4 +1,4 @@ -import type { VueI18n } from 'vue-i18n'; +import type { Composer } from 'vue-i18n'; export { useI18n } from 'vue-i18n'; @@ -7,7 +7,7 @@ export const locale: { addLocale: ({ locale, messages }: { locale: string; messages: object }) => void; getAllLocales: () => string[]; messages: Record; - t: VueI18n['t']; + t: Composer['t']; }; declare module '@fesjs/fes' { @@ -22,6 +22,6 @@ declare module '@fesjs/fes' { | false; } interface PluginRuntimeConfig { - onLocaleChange: (params: { t: VueI18n['t']; locale: string }) => void; + onLocaleChange: (params: { t: Composer['t']; locale: string }) => void; } } diff --git a/packages/plugin-model/package.json b/packages/plugin-model/package.json index 4b1810f3..45f3d805 100644 --- a/packages/plugin-model/package.json +++ b/packages/plugin-model/package.json @@ -36,7 +36,9 @@ }, "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", - "@fesjs/utils": "^4.0.0-beta.0" + "@fesjs/utils": "^4.0.0-beta.0", + "es-toolkit": "^1.46.0", + "glob": "^13.0.6" }, "typings": "./types.d.ts" } diff --git a/packages/plugin-model/src/index.ts b/packages/plugin-model/src/index.ts index e281130c..11996493 100644 --- a/packages/plugin-model/src/index.ts +++ b/packages/plugin-model/src/index.ts @@ -2,6 +2,7 @@ import type { IPluginAPI } from '@fesjs/shared'; import { readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { uniq } from 'es-toolkit/compat'; import pkg from '../package.json' assert { type: 'json' }; import { getModels } from './utils/getModels'; @@ -15,7 +16,7 @@ const __dirname = dirname(__filename); export default (api: IPluginAPI) => { const { paths, - utils: { lodash, Mustache, winPath }, + utils: { Mustache, winPath }, } = api; function getModelDir() { @@ -28,7 +29,7 @@ export default (api: IPluginAPI) => { function getAllModels() { const srcModelsPath = getModelsPath(); - return lodash.uniq([...getModels(srcModelsPath)]); + return uniq([...getModels(srcModelsPath)]); } const absCoreFilePath = join(namespace, 'core.js'); diff --git a/packages/plugin-model/src/utils/getModels.ts b/packages/plugin-model/src/utils/getModels.ts index 89c2ecd7..6cae6cfb 100644 --- a/packages/plugin-model/src/utils/getModels.ts +++ b/packages/plugin-model/src/utils/getModels.ts @@ -1,11 +1,10 @@ -import { glob } from '@fesjs/utils'; +import { globSync } from 'glob'; import { getValidFiles } from '.'; export function getModels(cwd: string, pattern?: string) { - const files = glob - .sync(pattern || '**/*.{js,jsx,ts,tsx}', { - cwd, - }) + const files = globSync(pattern || '**/*.{js,jsx,ts,tsx}', { + cwd, + }) .filter( file => !file.endsWith('.d.ts') && !file.endsWith('.test.js') diff --git a/packages/plugin-monaco-editor/package.json b/packages/plugin-monaco-editor/package.json index 196fe82b..5a106c11 100644 --- a/packages/plugin-monaco-editor/package.json +++ b/packages/plugin-monaco-editor/package.json @@ -36,10 +36,9 @@ "dependencies": { "@fesjs/shared": "^4.0.0-beta.0", "@fesjs/utils": "^4.0.0-beta.0", - "lodash-es": "^4.17.21", + "es-toolkit": "^1.46.0", "monaco-editor": "^0.36.1", - "monaco-editor-webpack-plugin": "^7.1.0", - "vite-plugin-monaco-editor": "^1.1.0" + "monaco-editor-webpack-plugin": "^7.1.0" }, "typings": "./types.d.ts" } diff --git a/packages/plugin-monaco-editor/src/index.ts b/packages/plugin-monaco-editor/src/index.ts index f8f5d089..d769bc0b 100644 --- a/packages/plugin-monaco-editor/src/index.ts +++ b/packages/plugin-monaco-editor/src/index.ts @@ -39,7 +39,6 @@ export default (api: IPluginAPI) => { const absEditorFilePath = join(namespace, 'editor.vue'); api.onGenerateFiles(() => { - // 文件写出 api.writeTmpFile({ path: absoluteFilePath, content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), {}), @@ -54,13 +53,14 @@ export default (api: IPluginAPI) => { path: absLoaderFilePath, content: Mustache.render(readFileSync(join(__dirname, 'runtime/loader.tpl'), 'utf-8'), { MONACO_EDITOR: 'monaco-editor', + IS_VITE: api.builder.name === 'vite', }), }); api.writeTmpFile({ path: absEditorFilePath, content: Mustache.render(readFileSync(join(__dirname, 'runtime/editor.tpl'), 'utf-8'), { - LODASH_ES: 'lodash-es', + LODASH_ES: 'es-toolkit/compat', }), }); @@ -83,11 +83,18 @@ export default (api: IPluginAPI) => { api.addRuntimePlugin(() => `@@/${absRuntimeFilePath}`); if (api.builder.name === 'vite') { - api.modifyBundleConfig((config) => { - const monacoEditorPlugin = esmRequire('vite-plugin-monaco-editor').default; - config?.plugins?.push(monacoEditorPlugin(api.config?.monacoEditor || {})); + api.modifyBundleConfig((memo) => { + memo.plugins.push({ + name: 'vite:monaco-editor-nls', + enforce: 'pre', + resolveId(id) { + if (id === 'monaco-editor/esm/vs/nls' || id.endsWith('/vs/nls')) { + return { id: 'monaco-editor/esm/vs/nls.js', moduleSideEffects: false }; + } + }, + }); + return memo; }); - // } else { api.chainWebpack((webpackConfig) => { diff --git a/packages/plugin-monaco-editor/src/runtime/editor.tpl b/packages/plugin-monaco-editor/src/runtime/editor.tpl index 44ca7d88..3d5edb05 100644 --- a/packages/plugin-monaco-editor/src/runtime/editor.tpl +++ b/packages/plugin-monaco-editor/src/runtime/editor.tpl @@ -5,7 +5,7 @@ import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue'; -import { merge, debounce } from '{{{ LODASH_ES }}}'; +import { merge, debounce } from 'es-toolkit/compat'; // eslint-disable-next-line import monaco from './loader'; diff --git a/packages/plugin-monaco-editor/src/runtime/loader.tpl b/packages/plugin-monaco-editor/src/runtime/loader.tpl index 0d206fe1..0aa1b5fc 100644 --- a/packages/plugin-monaco-editor/src/runtime/loader.tpl +++ b/packages/plugin-monaco-editor/src/runtime/loader.tpl @@ -1,7 +1,24 @@ +{{#IS_VITE}} +import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; +import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; +import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; +import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; +import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; + +self.MonacoEnvironment = { + getWorker(_, label) { + if (label === 'json') return new jsonWorker(); + if (label === 'css' || label === 'scss' || label === 'less') return new cssWorker(); + if (label === 'html' || label === 'handlebars' || label === 'razor') return new htmlWorker(); + if (label === 'typescript' || label === 'javascript') return new tsWorker(); + return new editorWorker(); + } +}; +{{/IS_VITE}} + import * as monaco from '{{{ MONACO_EDITOR }}}'; import defaultTheme from './theme/default'; -// 默认主题 defaultTheme.register(monaco); -export default monaco; \ No newline at end of file +export default monaco; diff --git a/packages/plugin-qiankun/examples/webpack-main/src/pages/index.vue b/packages/plugin-qiankun/examples/webpack-main/src/pages/index.vue index 294dcb69..1d23c837 100644 --- a/packages/plugin-qiankun/examples/webpack-main/src/pages/index.vue +++ b/packages/plugin-qiankun/examples/webpack-main/src/pages/index.vue @@ -1,8 +1,7 @@