diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 41b95a642788..475eb663dc5b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -36,11 +36,24 @@ jobs:
- name: Install pnpm
if: ${{ matrix.node-version != '14.x' }}
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
+
+ - name: Get pnpm version (node 14)
+ if: ${{ matrix.node-version == '14.x' }}
+ uses: actions/github-script@v7
+ id: pnpm-version
+ with:
+ result-encoding: string
+ script: |
+ const packageJson = require('./package.json')
+ const pnpmVersion = packageJson.packageManager.split('@')[1]
+ console.log(`Use pnpm ${pnpmVersion}`)
+ return pnpmVersion
- name: Install pnpm (node 14)
if: ${{ matrix.node-version == '14.x' }}
- run: npm install -g @pnpm/exe@8.6.2
+ run: |
+ npm install -g @pnpm/exe@${{ steps.pnpm-version.outputs.result }}
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
diff --git a/.github/workflows/compressed-size.yml b/.github/workflows/compressed-size.yml
index c75338fcd002..504b189bad53 100644
--- a/.github/workflows/compressed-size.yml
+++ b/.github/workflows/compressed-size.yml
@@ -25,7 +25,7 @@ jobs:
- uses: actions/checkout@v2
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use latest LTS Node.js
uses: actions/setup-node@v3
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 629c0ba6a01f..656af0de9d4d 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -38,7 +38,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v3
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
index a198c934f940..8f283a338a9f 100644
--- a/.github/workflows/doc.yml
+++ b/.github/workflows/doc.yml
@@ -33,7 +33,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v3
diff --git a/.github/workflows/e2e-basic.yml b/.github/workflows/e2e-basic.yml
index 5df77193c3ad..498679d1f779 100644
--- a/.github/workflows/e2e-basic.yml
+++ b/.github/workflows/e2e-basic.yml
@@ -37,7 +37,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
@@ -71,9 +71,9 @@ jobs:
run: pnpm i
- name: Build targets
- run: pnpm umi-scripts turbo build
- --filter ./examples/max...
- --filter ./examples/test-test/...
+ run: pnpm umi-scripts turbo build
+ --filter ./examples/max...
+ --filter ./examples/test-test/...
--filter ./packages/umi/...
- name: e2e:example:max
diff --git a/.github/workflows/e2e-boilerplate.yml b/.github/workflows/e2e-boilerplate.yml
index a26b28ac4703..25bf65f64ea8 100644
--- a/.github/workflows/e2e-boilerplate.yml
+++ b/.github/workflows/e2e-boilerplate.yml
@@ -36,7 +36,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
@@ -70,10 +70,10 @@ jobs:
run: pnpm i
- name: Build targets
- run: pnpm umi-scripts turbo build
- --filter ./examples/create-umi-simple...
- --filter ./examples/create-umi-pro/...
- --filter ./examples/antd-pro-create/...
+ run: pnpm umi-scripts turbo build
+ --filter ./examples/create-umi-simple...
+ --filter ./examples/create-umi-pro/...
+ --filter ./examples/antd-pro-create/...
--filter ./packages/umi/...
--filter ./packages/max/...
--filter ./packages/preset-vue/...
diff --git a/.github/workflows/e2e-mfsu.yml b/.github/workflows/e2e-mfsu.yml
index 9eefc7a7f735..c9aee6c29959 100644
--- a/.github/workflows/e2e-mfsu.yml
+++ b/.github/workflows/e2e-mfsu.yml
@@ -35,9 +35,9 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
-
+
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
diff --git a/.github/workflows/e2e-qiankun.yml b/.github/workflows/e2e-qiankun.yml
index d5830a7af260..9f4675317f78 100644
--- a/.github/workflows/e2e-qiankun.yml
+++ b/.github/workflows/e2e-qiankun.yml
@@ -36,7 +36,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
@@ -70,7 +70,7 @@ jobs:
run: pnpm i
- name: Build targets
- run: pnpm umi-scripts turbo build
+ run: pnpm umi-scripts turbo build
--filter ./examples/max...
- name: e2e:example:qiankun:dev
diff --git a/.github/workflows/e2e-vite.yml b/.github/workflows/e2e-vite.yml
index bc3e13b54e4b..8060502e7de8 100644
--- a/.github/workflows/e2e-vite.yml
+++ b/.github/workflows/e2e-vite.yml
@@ -36,7 +36,7 @@ jobs:
fetch-depth: 0
- name: Install pnpm
- uses: pnpm/action-setup@v2.2.4
+ uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
diff --git a/contributors.json b/contributors.json
index b370cdaa5a7c..3aabdc71ee7e 100644
--- a/contributors.json
+++ b/contributors.json
@@ -46,5 +46,6 @@
"qiguoq",
"AmJunh",
"MaxCDon",
- "mysteryven"
+ "mysteryven",
+ "Jinbao1001"
]
diff --git a/did-you-know/package.json b/did-you-know/package.json
index 731caf498087..41fba8d9f743 100644
--- a/did-you-know/package.json
+++ b/did-you-know/package.json
@@ -23,7 +23,6 @@
"devDependencies": {
"terminal-link": "^3.0.0"
},
- "packageManager": "pnpm@7.3.0",
"publishConfig": {
"access": "public"
},
@@ -151,7 +150,7 @@
"majorVersion": 4
},
{
- "text": "请求加载态、数据管理、避免竟态问题,用 react-query 帮你全部解决",
+ "text": "请求加载态、数据管理、避免竞态问题,用 react-query 帮你全部解决",
"url": "https://umijs.org/docs/max/react-query",
"majorVersion": 4
},
diff --git a/did-you-know/src/plugin.ts b/did-you-know/src/plugin.ts
index e05f955f965d..c21f2faba6d6 100644
--- a/did-you-know/src/plugin.ts
+++ b/did-you-know/src/plugin.ts
@@ -69,7 +69,7 @@ export default (api: any) => {
const cacheDir = path.join(api.paths.absNodeModulesPath, '.cache');
if (!fs.existsSync(cacheDir)) {
- fs.mkdirSync(cacheDir);
+ fs.mkdirSync(cacheDir, { recursive: true });
}
fs.writeFileSync(recordJSONPath, JSON.stringify(records), 'utf-8');
});
diff --git a/docs/.dumi/components/Contributing/index.less b/docs/.dumi/components/Contributing/index.less
new file mode 100644
index 000000000000..e777d1ef628b
--- /dev/null
+++ b/docs/.dumi/components/Contributing/index.less
@@ -0,0 +1,17 @@
+.contributing {
+ max-width: 1200px;
+ margin: 0 auto 60px;
+
+ :global {
+ p {
+ font-size: 18px;
+ color: #4a5e71;
+ margin-bottom: 16px;
+ }
+
+ p a {
+ color: #0273dc;
+ text-decoration: none;
+ }
+ }
+}
diff --git a/docs/.dumi/components/Contributing/index.tsx b/docs/.dumi/components/Contributing/index.tsx
index 635fef26d1bc..00f8cff895da 100644
--- a/docs/.dumi/components/Contributing/index.tsx
+++ b/docs/.dumi/components/Contributing/index.tsx
@@ -1,26 +1,10 @@
-import React from 'react';
-import styled from 'styled-components';
import { Link } from 'umi';
import { SectionHeader } from '../SectionHeader';
-
-const ContributingWrapper = styled.div`
- max-width: 1200px;
- margin: 0 auto 60px;
- p {
- font-size: 18px;
- color: #4a5e71;
- margin-bottom: 16px;
- }
-
- p a {
- color: #0273dc;
- text-decoration: none;
- }
-`;
+import styles from './index.less';
export const Contributing = () => {
return (
-
@@ -37,6 +21,6 @@ export const Contributing = () => {
Loading...
} + {posts &&{post.title}
+Loading...
} + {posts && ( +{post.title}
++ 编者按:Change the code, don't Workaround! Webpack + 慢就去改他,优化到位后,Bundle 也可以很快。此方案会在 Umi 4 + 中默认开启,适用于既要 Webpack 功能与生态,又想要 Vite 速度的同学们。 +
+ +Umi 4 中同时支持 webpack 和 vite 两种构建方式,跑通了后,迫不及待对比了 Vite 和 Webpack + MFSU 的效果,结果有点意外。关于什么是 MFSU,我在[《SEE Conf: Umi 4 设计思路文字稿》](https://mp.weixin.qq.com/s?__biz=MjM5NDgyODI4MQ%3D%3D&mid=2247484533&idx=1&sn=9b15a67b88ebc95476fce1798eb49146)中有一段详细介绍。 + ++ + 两个示例、四种模式、四个维度的对比。 + + 两个示例分别是大型的全量 ant-design-pro 和小型的 libs example;四种模式分别是 webpack、webpack + MFSU、webpack + MFSU with esbuild mode、Vite in umi;四个维度分别是无缓存的冷启动、有缓存的热启动、修改代码后的热更新、页面打开速度。 +
+ +多说几点和统计相关的。上述 webpack 相关模式全部开启物理缓存;Vite 是 Umi 中集成后的 Vite,也有担心是不是 Umi 对于 Vite 的误用,经开发者确认,基本排除误用的可能性,大段时间消耗在预编译依赖上;Ant Design Pro 中包含 less 的使用,这是使用 esbuild 无法加速的部分,这有影响,但对于不同模式应该是公平的;下图数据是本地用 13-inch M1 2022 重启电脑后跑 5 次后平均取值的结果;Vite 的热更速度没统计是因为由于 esm 的特性,改完后要等请求过来后处理完才算结束,无法统计,但肯定是很快的。 + +直接上结果。有兴趣手动验证的同学可到 umijs/umi 仓库的不同 example 目录下执行 npm run dev 验证。 + +![](https://img.alicdn.com/imgextra/i4/O1CN01Gz9AA81szqy3BbRfK_!!6000000005838-2-tps-2150-1084.png) + ++ 图:全量 ant-design-pro 速度对比图 +
+ +![](https://img.alicdn.com/imgextra/i1/O1CN01HNfH7l23L3SRjJUka_!!6000000007238-2-tps-2058-1078.png) + ++ 图:libs example 速度对比图 +
+ +可以看到,**在这几个场景下,MFSU with esbuild 数据领先。** 四个模式的页面打开速度差不多,所以对比数据没在图中列出,这也是让我意外的点,原以为 Vite 请求多会让页面打开速度变慢,也有可能项目还不够复杂? diff --git a/docs/docs/blog/mfsu-faster-than-vite.md b/docs/docs/blog/mfsu-faster-than-vite.md index b6337e1071dc..19df5e5a07f9 100644 --- a/docs/docs/blog/mfsu-faster-than-vite.md +++ b/docs/docs/blog/mfsu-faster-than-vite.md @@ -19,8 +19,7 @@ Umi 4 中同时支持 webpack 和 vite 两种构建方式,跑通了后,迫 两个示例、四种模式、四个维度的对比。 - 两个示例分别是大型的全量 ant-design-pro 和小型的 libs example;四种模式分别是 webpack、webpack - + MFSU、webpack + MFSU with esbuild mode、Vite in umi;四个维度分别是无缓存的冷启动、有缓存的热启动、修改代码后的热更新、页面打开速度。 + 两个示例分别是大型的全量 ant-design-pro 和小型的 libs example;四种模式分别是 webpack、webpack + MFSU、webpack + MFSU with esbuild mode、Vite in umi;四个维度分别是无缓存的冷启动、有缓存的热启动、修改代码后的热更新、页面打开速度。 多说几点和统计相关的。上述 webpack 相关模式全部开启物理缓存;Vite 是 Umi 中集成后的 Vite,也有担心是不是 Umi 对于 Vite 的误用,经开发者确认,基本排除误用的可能性,大段时间消耗在预编译依赖上;Ant Design Pro 中包含 less 的使用,这是使用 esbuild 无法加速的部分,这有影响,但对于不同模式应该是公平的;下图数据是本地用 13-inch M1 2022 重启电脑后跑 5 次后平均取值的结果;Vite 的热更速度没统计是因为由于 esm 的特性,改完后要等请求过来后处理完才算结束,无法统计,但肯定是很快的。 diff --git a/docs/docs/blog/mfsu-independent-usage.en-US.md b/docs/docs/blog/mfsu-independent-usage.en-US.md new file mode 100644 index 000000000000..68857e23e3c4 --- /dev/null +++ b/docs/docs/blog/mfsu-independent-usage.en-US.md @@ -0,0 +1,257 @@ +--- +toc: content +order: 4 +group: + title: Blog +--- + +# 独立使用 MFSU + +`MFSU` 支持独立在非 umijs 项目中使用,本文将会介绍如何将 `MFSU` 接入你的 webpack 项目。 + +## 示例项目 + +如何接入 MFSU ?提供以下几个 示例项目 配置供参考: + +Webpack 配置示例:examples/mfsu-independent + +CRA v5 配置示例:cra-v5-with-mfsu-example + +## 安装 + +首先安装 `mfsu` 的依赖: + +```bash + pnpm add -D @umijs/mfsu +``` + +## 配置 MFSU + +配置 MFSU 一共需要简单的四步操作,请确保以下所有行为都只在开发环境生效。 + +### 1. 初始化实例 + +第一步,初始化一个 `MFSU` 实例,这是 `MFSU` 的基础: + +```js +// webpack.config.js + +const { MFSU } = require('@umijs/mfsu'); +const webpack = require('webpack'); + +// [mfsu] 1. init instance +const mfsu = new MFSU({ + implementor: webpack, + buildDepWithESBuild: true, +}); +``` + +### 2. 添加中间件 + +第二步,添加 `MFSU` 的 `devServer` 中间件到 webpack-dev-server 中,他将为你提供 `MFSU` 所需打包后的资源: + +#### webpack 5 + +```js +// webpack.config.js + +module.exports = { + devServer: { + // [mfsu] 2. add mfsu middleware + setupMiddlewares(middlewares, devServer) { + middlewares.unshift(...mfsu.getMiddlewares()); + return middlewares; + }, + }, +}; +``` + +#### webpack 4 + +```js +// webpack.config.js + +module.exports = { + devServer: { + // [mfsu] 2. add mfsu middleware + onBeforeSetupMiddleware(devServer) { + for (const middleware of mfsu.getMiddlewares()) { + devServer.app.use(middleware); + } + }, + }, +}; +``` + +### 3. 配置转换器 + +第三步,你需要配置一种源码转换器,他的作用是用来收集、转换依赖导入路径,替换为 `MFSU` 的模块联邦地址(中间件所提供的)。 + +此处提供两种方案:`babel plugins` 或 `esbuild handler` ,一般情况下选择 `babel plugins` 即可。 + +#### Babel Plugins + +向 `babel-loader` 添加 `MFSU` 的 `babel plugins` 即可。 + +```js +// webpack.config.js + +module.exports = { + module: { + rules: [ + // handle javascript source loader + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + plugins: [ + // [mfsu] 3. add mfsu babel plugins + ...mfsu.getBabelPlugins(), + ], + }, + }, + }, + ], + }, +}; +``` + +#### Esbuild handler + +另一种方案是使用内置提供的 `esbuild-loader` 来处理 `js/ts` 资源,**仅用于开发环境** 。 + +:::info +使用这种方案的好处是:在开发环境获得比 `babel` 更快的编译和启动速度 +::: + +```js +// webpack.config.js + +const { esbuildLoader } = require('@umijs/mfsu'); +const esbuild = require('esbuild'); + +module.exports = { + module: { + rules: [ + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + use: { + loader: esbuildLoader, + options: { + handler: [ + // [mfsu] 3. add mfsu esbuild loader handlers + ...mfsu.getEsbuildLoaderHandler(), + ], + target: 'esnext', + implementation: esbuild, + }, + }, + }, + ], + }, +}; +``` + +:::warning +什么时候我不应该使用 esbuild 方案?+ 新官网和文档。 + 下图是新官网的首页,包括重新梳理的文档、信息结构、以及新写的文档插件。目前包含基础的配置、API、升级和快速上手等基础文档,剩余文档还在紧张编写中。有个变化是之前插件的文档集成到 + Umi 官网中,成为 Umi Max 的一部分,之后无需跳转。 +
+ +![](https://img.alicdn.com/imgextra/i1/O1CN014dDq4L1Zc3guRwcse_!!6000000003214-2-tps-1600-941.png) + ++ MFSU V3 & 默认开启。 + MFSU 更新了他的第三个大版本,如果你有用 Umi 3 内置的 MFSU 并遇到问题,建议重新尝试,这个版本有很多改进,解决基本所有之前可能会遇到的诡异问题,并且编译速度和页面打开速度都更快。昨天我还有写一篇 + [《比 Vite 更快的 MFSU》](https://mp.weixin.qq.com/s?__biz=MjM5NDgyODI4MQ==&mid=2247484624&idx=1&sn=2addfa8cc2511fbea91faf831195788f)。基于此,我们自信地把这个功能在 + Umi 4 中默认开启。还有值得一提的是,MFSU 可脱离 Umi 运行。 +
+ +![](https://img.alicdn.com/imgextra/i2/O1CN01Znj8HD1mCwz72voXv_!!6000000004919-2-tps-1600-807.png) + ++ 双构建引擎和 ESMi。 + Umi 4 提供 Vite 和 Webpack 两种构建模式供开发者选择,并尽可能保证他们之间功能的一致性,可能有些同学会喜欢 + dev 用 vite,build 用 webpack 这样的组合。同时基于 Vite 模式实现了 ESMi 的 Client + 端,ESMi 依赖服务端,在外网还无法使用。 +
+ ++ Webpack 5。Umi 4 + 默认使用 webpack 5 并开启物理缓存。 +
+ ++ + React Router 6 & 新路由。 + + Umi 4 的路由基于 React Router 6 实现,个人非常喜欢这个版本,因为 Remix 的原因,React + Router 6 从设计上考虑了配置式路由的场景,让我得以删除大量 Umi 3 中关于路由渲染的代码。同时基于此,设计了新的路由结构,方便扩展和在未来处理路由的约定式请求。 +
+ ++ 最佳实践迭代。 + 针对之前 umijs/plugins 仓库中的插件进行了重写、升级,并整合到主仓库。这么做是为了更好的顶层设计,让官方插件之间的风格更一致。 +
+ ++ 依赖预打包。 + 由于服务企业内部,安全和稳定是其中很重要点,加上最近 colors 和 faker.js 闹得社区沸沸扬扬,谁都不希望睡一觉醒来,自己负责的业务挂了,还背个故障。Umi + 4 接着 Umi 3 继续做依赖预打包的事,并且更彻底,不仅是 node 侧的依赖,部分运行时的依赖也会做锁定,比如 + core-js 和 @babel/runtime。 +
+ +![](https://img.alicdn.com/imgextra/i1/O1CN01h44iJg1T09DNuYOlm_!!6000000002319-2-tps-1600-758.png) + ++ Umi Max。Umi Max + 是内部 Bigfish + 框架的对外版本,解我们自己的问题,同时也给社区另一个集中化框架的选择。 +
+ ++ + Low Import 研发模式。 + + 这是 Umi 4 的试验性功能之一,目前已开发完成,解的问题是让开发者少些或不写 import + 语句。项目中大量的 import 其实都可以通过工程化的方式自动处理。Umi 4 里通过 lowImport:{' '} + {} 开启,然后就可以无 import 直接用路由相关的 Link、useLocation 等,数据流相关的 + connect、useModel,antd 组件 Button、Calendar 等,以及其他更多。 +
+ +![](https://img.alicdn.com/imgextra/i4/O1CN0142Vcpt25kMZqjmioe_!!6000000007564-2-tps-1600-631.png) + ++ 强约束功能集成。Umi + 4 提供 API 让强约束和代码校验变得非常容易。API 包括 + api.onCheck、api.onCheckConfig、api.onCheckPkgJSON 和 + api.onCheckCode,顾名思义,非常好理解他们分别是干嘛的,可以分别对依赖类、代码类和配置类的内容做校验和卡点,适用于团队。 +
+ ++ + Import All From Umi 迭代。 + + 这是两年前 Umi 3 加的功能,最近发现 Remix、prisma、vitekit 等框架和工具都有类似实现。这种方式有好有坏。好处是通过 + umi 将大量依赖管理起来,用户无需手动安装。坏处是更黑盒,同时有点 Hack。Umi 4 不能解其黑盒问题,但解了 + Hack 问题,让实现无副作用,可以和 Vite、MFSU 等方案无缝结合。 +
+ ++ + srcTranspiler 和 depTranspiler。 + + 提供针对源码编译和依赖编译更多选择。源码编译可选 babel、swc 和 esbuild,目前没有银弹,合适场景做合适的选择。比如 + swc 由于不支持 top level await,和 mfsu 会有些冲突,但他适用于 build,因为有补丁可以兼容到 + es7;比如 esbuild 适用于 dev,因为快。数据方面以 ant-design-pro 项目为例,源码编译用 + esbuild 相比 babel 在 M1 2020 无缓存情况下会快 3s。 +
+ ++ + jsMinifier 和 cssMinifier。 + + js 压缩和 css 压缩 Umi 4 默认都用的 esbuild,因为快。同时也提供更多选择,js 压缩还支持 + swc、terser 和 uglifyJs,css 压缩还支持 cssnano。 +
+ ++ 应用元数据。Umi 4 + 有通过 api.appData + 收集各种项目数据,从配置、路由、package.json、tsconfig.json、npmClient + 到数据流、国际化、antd 用了哪个版本、react 和 react-dom + 的版本等,应有尽有,这对于插件开发者会非常实用,也适用于有统计需求的场景。 +
+ ++ 微生成器。没错,就是 + modern.js 的微生成器,这功能从 modern.js + 里学习了不少,名字就不改了。举个例子,比如 prettier + 功能,可能不是每个项目都需要,就比较适用于微生成器,按需启用、添加配置、安装依赖。 +
+ ++ 贴心小改进。 + 还有不少贴心小改进,举两个例子。1 是项目中新增 plugin.ts,会默认作为插件添加,方便项目进行一些插件级的扩展;2 + 是调试问题时通常需要修改编译后的代码看看有没有改对,你把 umi.js 下下来存到项目根目录,umi + 会优先使用这份代码。 +
+ +以上是 Umi 4 目前的新功能。 + +除此之外,还有一些计划在正式版发布之前做的事情。包括 api route、umi server and adapter、route loader、稳定的 lint、更多命令、组件研发 father 4、文档工具 dumi 2 等,会在之后的 RC 版本中与大家见面。 + +欢迎大家尝鲜 Umi 4,官方文档有准备 ant-design-pro 从 Umi 3 到 4 的升级文档。同时 RC 阶段,还准备了一个手把手升级的微信交流群,欢迎 Umi 4 的先行者们加入,祝大家升级顺利,也提前祝大家新年快乐 🧨,🐯 年吉祥。 + ++ +
diff --git a/docs/docs/blog/umi-4-rc.md b/docs/docs/blog/umi-4-rc.md index a7a85d7498f3..c9f8ac45875f 100644 --- a/docs/docs/blog/umi-4-rc.md +++ b/docs/docs/blog/umi-4-rc.md @@ -22,8 +22,7 @@ group:MFSU V3 & 默认开启。 MFSU 更新了他的第三个大版本,如果你有用 Umi 3 内置的 MFSU 并遇到问题,建议重新尝试,这个版本有很多改进,解决基本所有之前可能会遇到的诡异问题,并且编译速度和页面打开速度都更快。昨天我还有写一篇 - [《比 Vite 更快的 MFSU》](https://mp.weixin.qq.com/s?__biz=MjM5NDgyODI4MQ==&mid=2247484624&idx=1&sn=2addfa8cc2511fbea91faf831195788f)。基于此,我们自信地把这个功能在 - Umi 4 中默认开启。还有值得一提的是,MFSU 可脱离 Umi 运行。 + 《比 Vite 更快的 MFSU》。基于此,我们自信地把这个功能在Umi 4 中默认开启。还有值得一提的是,MFSU 可脱离 Umi 运行。
![](https://img.alicdn.com/imgextra/i2/O1CN01Znj8HD1mCwz72voXv_!!6000000004919-2-tps-1600-807.png) @@ -138,9 +137,9 @@ group: 以上是 Umi 4 目前的新功能。 -除此之外,还有一些计划在正式版发布之前做的事情。包括 api route、umi server and adapter、route loader、稳定的 lint、更多命令、组件研发 father 4、文档工具 dumi 2 等,会在之后的 RC 版本中与大家见面。 +除此之外,还有一些计划在正式版发布之前做的事情。包括 api route、umi server and adapter、route loader、稳定的 lint、更多命令、组件研发 father 4、文档工具 dumi 2 等,会在之后的 RC 版本中与大家见面。 -欢迎大家尝鲜 Umi 4,官方文档有准备 ant-design-pro 从 Umi 3 到 4 的升级文档。同时 RC 阶段,还准备了一个手把手升级的微信交流群,欢迎 Umi 4 的先行者们加入,祝大家升级顺利,也提前祝大家新年快乐 🧨,🐯 年吉祥。 +欢迎大家尝鲜 Umi 4,官方文档有准备 ant-design-pro 从 Umi 3 到 4 的升级文档。同时 RC 阶段,还准备了一个手把手升级的微信交流群,欢迎 Umi 4 的先行者们加入,祝大家升级顺利,也提前祝大家新年快乐 🧨,🐯 年吉祥。
) {
+ const hash = createHash('md5');
+ hash.update(JSON.stringify(env));
+ const result = hash.digest('hex');
+ return result;
+}
+```
+
+请格外注意:
+
+1. 你的项目有哪些文件、依赖会影响项目,配置他们作为依赖,变更时可以使得缓存失效。
+
+2. 因为 `process.env` 包括了所有的 nodejs 环境变量,这非常多,如果环境变量在 CI 中每次构建都存在差异,请挑选所需的环境变量,或者排除掉会变化的。
+
+ ```ts
+ // 如挑选可能会影响项目内容的环境变量
+ createEnvironmentHash({
+ NODE_ENV: process.env.NODE_ENV,
+ // ...
+ });
+ ```
+
+### Monorepo 中的项目
+
+在 monorepo 中,如何缓存需要前置构建的其他子包,比如构建 `apps/project-umi` 需要先构建好他依赖的子包 `libs/component` ,但是下次 `libs/component` 没有代码改动,如何跳过这部分前置依赖的构建?
+
+此时推荐你使用 [Turborepo](https://turbo.build/repo) 来做 monorepo 构建方案,具体使用方法请参见 [官方文档](https://turbo.build/repo/docs) 和 [examples](https://github.com/vercel/turbo/tree/main/examples) 。
+
+注:如果在 CI 中构建,同样需要容器支持恢复上次的 turbo 缓存,可以通过 [`--cache-dir`](https://turbo.build/repo/docs/reference/command-line-reference#--cache-dir) 选项更改缓存位置。
diff --git a/docs/docs/docs/api/api.en-US.md b/docs/docs/docs/api/api.en-US.md
new file mode 100644
index 000000000000..5c7432892927
--- /dev/null
+++ b/docs/docs/docs/api/api.en-US.md
@@ -0,0 +1,741 @@
+---
+order: 1
+toc: content
+translated_at: '2024-03-17T10:47:17.550Z'
+---
+
+# API
+
+For ease of search, the following content is sorted alphabetically.
+
+## umi
+
+### createBrowserHistory
+
+Creates a `BrowserHistory` that uses the browser's built-in `history` to track application navigation. It is recommended for use in modern web browsers that support the HTML5 `history` API.
+
+Type definition is as follows:
+```ts
+function createBrowserHistory(options?: { window?: Window }) => BrowserHistory;
+```
+
+Usage example:
+```ts
+// create a BrowserHistory
+import { createBrowserHistory } from 'umi';
+const history = createBrowserHistory();
+// or a iframe BrowserHistory
+import { createBrowserHistory } from 'umi';
+const history = createBrowserHistory({
+ window: iframe.contentWindow,
+});
+```
+### createHashHistory
+
+`createHashHistory` returns a `HashHistory` instance. The default `window` is the current document's `defaultView`.
+
+The main difference between `HashHistory` and `BrowserHistory` is that `HashHistory` stores the current location in the hash part of the URL, which means it does not send a request to the server when switching routes. If you are hosting your site on a server that you cannot fully control, or in a single-page Electron application, `HashHistory` is recommended.
+
+Usage example:
+```ts
+// create a HashHistory
+import { createHashHistory } from 'umi';
+const history = createHashHistory();
+```
+
+### createMemoryHistory
+
+`MemoryHistory` is not operated or read from the address bar. It is also very suitable for testing and other rendering environments.
+
+```ts
+const history = createMemoryHistory(location)
+```
+
+### createSearchParams
+
+A utility function that wraps `new URLSearchParams(init)`, supports creating with arrays and objects
+
+```ts
+import { createSearchParams } from 'umi';
+
+
+// Assuming the path http://a.com?foo=1&bar=2
+createSearchParams(location.search);
+createSearchParams("foo=1&bar=2");
+createSearchParams("?foo=1&bar=2");
+
+// Key-value pair object
+createSearchParams({ foo: 'bar', qux: 'qoo'}).toString()
+// foo=bar&qux=qoo
+
+// Key-value tuple array
+createSearchParams([["foo", "1"], ["bar", "2"]]).toString()
+// foo=1&bar=2
+```
+
+[URLSearchParams documentation](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams)
+
+### generatePath
+
+Generates the actual route to be accessed using the given path with parameters and the corresponding params.
+
+```ts
+import { generatePath } from 'umi';
+
+generatePath("/users/:id", { id: "42" }); // "/users/42"
+generatePath("/files/:type/*", {
+ type: "img",
+ "*": "cat.jpg",
+}); // "/files/img/cat.jpg"
+```
+
+### Helmet
+
+The Helmet component provided by [react-helmet-async](https://github.com/staylor/react-helmet-async), used to dynamically configure tags in the `head` of the page, such as the `title`.
+
+> Note: To ensure Helmet still works during SSR, be sure to use the Helmet provided by Umi instead of installing react-helmet separately
+
+```tsx
+import { Helmet } from 'umi';
+
+export default function Page() {
+ return (
+
+
{msg}
; +}; +``` + +Note that the key-value pair object used for assignment should be passed as the second parameter of the `formatMessage()` method. + +The rendered result is as follows: + +```html + +张三,今天也是美好的一天!
+ + +张三, what a nice day!
+``` + +## Switching Languages + +The preset `