From ff8bdf4f7b8beeb09a153625905bb144d24fd4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=B0=8F=E8=81=AA?= Date: Mon, 20 Jul 2020 15:17:19 +0800 Subject: [PATCH] docs: add faqs (#5044) --- docs/docs/faq.zh-CN.md | 352 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 349 insertions(+), 3 deletions(-) diff --git a/docs/docs/faq.zh-CN.md b/docs/docs/faq.zh-CN.md index 744e6023a1fe..a30853781d82 100644 --- a/docs/docs/faq.zh-CN.md +++ b/docs/docs/faq.zh-CN.md @@ -1,12 +1,12 @@ # FAQ -> Coming soon... +## General -## Umi 3 只能用 TypeScript 写吗? +### Umi 3 只能用 TypeScript 写吗? 不是。文档中的 `.ts` 替换为 `.js` 同样有效,因为不想每次都带上 `.(j|t)sx?`。 -## import from umi 没有定义怎么办? +### import from umi 没有定义怎么办? 比如: @@ -20,3 +20,349 @@ import { history } from 'umi'; 1. tsconfig.json 中有配置 `@@` 的路径,比如 `"@@/*": ["src/.umi/*"]`,参考 [tsconfig.json 模板](https://github.com/umijs/umi/blob/master/packages/create-umi-app/templates/AppGenerator/tsconfig.json) 2. 确保 `src/.umi/core/umiExports.ts` 有相关内容,如果没有,可通过 `umi build`、`umi dev` 或 `umi g tmp` 任一命令生成 + +### 如何动态修改 title ? + +可以通过 [react-document-title](https://github.com/gaearon/react-document-title) 动态修改 title 。 + +### layout 路由如何传值给子路由 + +推荐用 context 或者数据流方案,如果用 cloneElement 传值需要传两级,因为第一级是 Switch,然后才是 Route。 + +```js +React.Children.map(children, child => { + return React.cloneElement(child, null, React.Children.map(child.props.children, child => { + return React.cloneElement(child, { test: 'test' }); + })); +}) +``` + +参考: + +* https://github.com/umijs/umi/pull/1282#issue-224134432 + +## 报错 + +### `umi` 不是内部或外部命令 + +e.g. + + + +需配置 NODE_PATH 环境变量,如使用 yarn,可通过执行 `yarn global bin` 拿到 bin 路径。 + +### 配了 `dynamicImport.loadingComponent` 后外层报错不生效怎么办? + +组件报错有两种形式: + +1) + +```js +a(); // 出错 +export default () => <>..; +``` + +2) + +```js +export default () => { + a(); // 出错 + return <>..; +} +``` + +第二种不管怎么样都能正常抛错,第一种在开启 dynamicImport 并配置了 loadingComponent 时可能会不生效。 + +比如 loadingComponent 指向的文件内容为: + +```js +export default () => <>loading... +``` + +那么出错时也会只显示 loading... 。 + +#### 解决 + +loadingComponent 处理出错场景,比如: + +```js +export default class extends React.PureComponent { + render() { + if (process.env.NODE_ENV === 'development' && this.props.error) { + console.error(this.props.error.stack); + return
{this.props.error.stack}
; + } + return
loading...
; + } +}; +``` + +### ie报错和压缩问题解决思路 + +感觉现在ie下的错误,都是因为这个问题引起的。 + +#### 典型错误 + +![image](https://user-images.githubusercontent.com/11746742/62197556-a37dec00-b3b2-11e9-8f72-999058e9b305.png) + +#### 解决思路 + +##### 第一步、确认你的需求 + +主要是**是否需要兼容旧版本不支持 es6 的浏览器**, + +* 如果需要兼容,跳到第二步 +* 如果不需要兼容,配置 `minimizer` 为 `terserjs` + +##### 第二步 + +检查 `targets` 配置,确认是否有包含旧版本浏览器比如, + +```js +{ + targets: { ie: 10 }, +} +``` + +尝试构建,如果没有问题,则不用再执行下一步。 + +##### 第三步、记录错误文件和行号 + +比如前面的, + +* 文件:vendors.async.js +* 行号:193 +* 出错 token:`>` + +##### 第四步、不压缩构建,查找出错源 + +```bash +# 如果你用 umi +$ COMPRESS=none umi build + +# 如果你用 bigfish +$ COMPRESS=none bigfish build +``` + +找 `vendors.async.js` 的 193 行,看下是哪个包出错的,记录包名和版本号。 + +##### 第五步、修改本地`node_modules/es5-imcompatible-versions/package.json` 文件,写入刚刚出错的包名和版本号。 + +```js +"antd-table-infinity": { + "^1.1.2": { + "version": "^1.1.2", + "reason": "https://github.com/Leonard-Li777/antd-table-infinity/blob/master/src/components/Table/InfinityTable/index.jsx#L7" + } + } +``` + +##### 第六步、保存文件,重新build,确认错误已修复 + +##### 第七步、给 [es5-imcompatible-versions](https://github.com/umijs/es5-imcompatible-versions) 提 PR + +###### 不会提交PR的同学,请按下面步骤操作 +1、在[编辑](https://github.com/umijs/es5-imcompatible-versions/edit/master/package.json)里面,把你刚才的修改,在这里也修改一下。 +2、修改完,页面拉到最下方。创建一个分支(可能会是自动创建分支的情况,如果没得选择,这里不理会就好)点击绿色按钮 `Propose file change` +![image](https://user-images.githubusercontent.com/11746742/62198380-189df100-b3b4-11e9-8684-8e5fc9d2e929.png) +3、在跳转后的页面,点击绿色按钮 `Create pull request` +![image](https://user-images.githubusercontent.com/11746742/62198516-5ac73280-b3b4-11e9-9130-aaee6defdb03.png) + +##### 第八步、将跳转后的链接,发到群里面。等待合并 + +如:` https://github.com/umijs/es5-imcompatible-versions/pull/36` + +#### 参考 + +* [https://github.com/sorrycc/blog/issues/68](https://github.com/sorrycc/blog/issues/68) +* [https://github.com/umijs/es5-imcompatible-versions](https://github.com/umijs/es5-imcompatible-versions) + +### The dependency was not found + +![The dependency was not found](https://user-images.githubusercontent.com/11746742/87644864-49229a80-c77f-11ea-909d-8e3d2bb5d7c2.png) + +一般是网络不好装包错误导致的,可以删除 `*.lock` 和 `node_modules` 重新执行 `yarn`,如果多次尝试都无法解决。可以在项目目录下执行 `git clean -dfx`,再重装,一般可以解决。 + +如果同一个项目你同事可以运行,你运行出错。一般都是缓存或者安装包过程出错问题。可以尝试删除几个缓存目录,比如删除 `src/.umi/cache` 后重试。 + +## webpack + +### 如何配置额外的 loader ? + +比如 svg 我希望不走 base64,而是全部产生 svg 文件,可以这样配: + +```js +export default { + // 添加 url-loader 的 exclude + urlLoaderExcludes: [/.svg$/], + // 添加 loader + chainWebpack(config) { + config.module.rule('svg-with-file') + .test(/.svg$/) + .use('svg-with-file-loader') + .loader('file-loader') + }, +} +``` + +## CSS + +### 为啥我 import 的 css 文件不生效? + +umi 默认是开启 css modules 的,请按照 css modules 的方式进行书写。 + +参考: + +* [css-modules/css-modules](https://github.com/css-modules/css-modules) +* [CSS Modules 用法教程](http://www.ruanyifeng.com/blog/2016/06/css_modules.html) + +### 如何禁用 css modules ? + +修改 `.umirc.js`: + +```json +{ + "disableCSSModules": true +} +``` + +但没有特殊的理由时,不建议关闭 css modules。 + +### 如何使用 sass ? + +先安装额外的依赖, + +```bash +$ npm i node-sass sass-loader --save +``` + +然后修改 `.umirc.js`: + +```json +{ + "sass": {} +} +``` + +#### 开启按需加载后如何把 css 打包成一个文件? + +配置 splitChunks,比如: + +```js +export default { + dynamicImport: { + }, + chainWebpack(config) { + config.optimization.splitChunks({ + cacheGroups: { + styles: { + name: 'styles', + test: /\.(css|less)$/, + chunks: 'async', + minChunks: 1, + minSize: 0, + } + }, + }); + }, +} +``` + +打包后会输出: + +``` +File sizes after gzip: + + 126.85 KB dist/umi.js + 535 B dist/p__users.async.js + 533 B dist/p__index.async.js + 337 B dist/styles.async.js + 96 B dist/styles.chunk.css +``` + +示例: + +* [sorrycc-123.zip](https://github.com/umijs/umi/files/2556654/sorrycc-123.zip) + +参考: + +* https://github.com/webpack-contrib/mini-css-extract-plugin#extracting-all-css-in-a-single-file +* https://github.com/umijs/umi/blob/master/packages/umi-plugin-react/test/chunks/.umirc.js#L1 + +### 如何禁用掉每次刷新路由时出现的 loading... 状态? + +给 dynamicImport 配置加上 `loadingComponent: '() => <>'`,比如: + +``` +export default { + plugins: [ + ['umi-plugin-react', { + dynamicImport: { loadingComponent: '() => <>' }, + }], + ] +} +``` + +## Test + +### 如何断点调试 + +确保 node 在 8.10 以上,然后执行: + +```bash +$ node --inspect-brk ./node_modules/.bin/umi test +``` + +然后在浏览器里打开 chrome://inspect/#devices 进行 inspect 和断点。 + +## 请求 + +### proxy代理不成功,没有代理到实际地址 + +![image](https://user-images.githubusercontent.com/22974879/48049412-8debe500-e1d9-11e8-8f36-0c3aa89c50b0.png) + +代理只是服务请求代理,这个地址是不会变的。 +原理可以简单的理解为,在本地启了一个服务,你先请求了本地的服务,本地的服务转发了你的请求到实际服务器。所以你在浏览器上看到的请求地址还是http://localhost:8000/xxx 。以服务端是否收到请求为准 + +https://github.com/ant-design/ant-design-pro/issues/2779 + +## 部署 + +### build 后访问路由刷新后 404? + +几个方案供选择: + +* 改用 hashHistory,在 `.umirc.js` 里配 `history: 'hash'` +* 静态化,在 `.umirc.js` 里配 `exportStatic: true` +* 服务端配置路由 fallback 到 index.html + +### build之后图片丢失? + +可能是图片没有正确引用,可以参考一下代码,正确引入图片。 + +```js +import React from 'react'; +import logo from './logo.png'; // 告诉WebPACK这个JS文件使用这个图像 + +console.log(logo); // logo.84287d09.png + +function Header() { + // 导入图片 + return Logo; +} + +export default Header; + +``` +在css中使用,注意不要使用绝对路径 +```css +.Logo { + background-image: url(./logo.png); +} +``` + +> 注意:图片大小小于 10 k 时会走 base64。即不会被拷贝到 public 文件夹下,而是以 base64 的资源存在。 + +### 部署在静态文件服务时,如搭配 cordova 使用,页面空白,提示找不到文件? + +可以尝试配置 `publicPath: './',`