React
Tools
@loadable/component
loadable 进行加载的组件,在 List 中渲染时,会抛常见的 无 key,错误,尝试读取 displayName 做 key,发现由于组件被高阶包裹,获取了 Lodable
这个不需要的 key,尝试通过 加载文件 index 先预设 displayName 初始值,再在加载完毕后,替换为真实想要设置的 displayName:
import * as loadable from '@loadable/component';
type LoadableComponent<T> = loadable.LoadableComponent<T>;
const load = <T extends unknown>(loaders) => {
// 每个 loader(() => import())都是用 loadable.default 进行加载
return loaders.map((fileLoader, componentIndex: number) => {
const loadedComponent = loadable.default(() => {
return fileLoader.then((module, index) => {
// () => import 加载完毕,读取文件内的信息,设置正确的 displayName
loadedComponent.displayName =
module.INNER_NAME || module?.default.displayName || `Loaded_${index}`;
return module;
});
});
// Module 未加载完成,使用默认的 displayName
if (!loadedComponent.displayName || loadedComponent.displayName === 'Loadable') {
loadedComponent.displayName = `Loadable_${componentIndex}`;
}
return loadedComponent;
}) as T;
};
Test
async, import()
对于 async 类操作,或 import() 动态文件加载,可以使用该方法进行模拟,实际就是一个返回 Promise 的函数
https://jestjs.io/docs/mock-function-api#mockfnmockresolvedvaluevalue
mockFn.mockResolvedValue(value)
Syntactic sugar function for:
jest.fn().mockImplementation(()=>Promise.resolve(value));
Useful to mock async functions in async tests:
test('async test',async()=>{
const asyncMock = jest.fn().mockResolvedValue(43);
awaitasyncMock();// 43
});
const resolvedToDefault = value =>
jest.fn().mockResolvedValue({ default: value })
// 模拟一个 default 导出为 loaded 字符串的 esmodule
const load = resolvedToDefault(() => 'loaded')
Words
比起一种判别法“是什么”,“怎么来的”才更重要
Infos
一些术语
https://docs.google.com/spreadsheets/d/1HL3E_eNF3rI6dy3k7_EpSOLo1eRkBDNIEPeyTg_Eu3s/edit#gid=0
类型术语
https://ice1000.org/notes/chinese-glossary.html