使用 typescript 模板将 create-react-app 更新到 4.0 时出错
Posted
技术标签:
【中文标题】使用 typescript 模板将 create-react-app 更新到 4.0 时出错【英文标题】:Error when updating create-react-app to 4.0 with typescript template 【发布时间】:2021-01-14 20:16:56 【问题描述】:我想将react-scripts
更新到下一个版本 (4.0.0
),这样我就可以通过本指南here 使用快速刷新功能。但是在重启服务器时,由于以下错误,脚本无法运行:
$ yarn start
yarn run v1.22.4
$ react-scripts start
E:\Github\Web\so-rank\node_modules\react-scripts\scripts\utils\verifyTypeScriptSetup.js:210
appTsConfig.compilerOptions[option] = suggested;
^
TypeError: Cannot add property noFallthroughCasesInSwitch, object is not extensible
at verifyTypeScriptSetup (E:\Github\Web\so-rank\node_modules\react-scripts\scripts\utils\verifyTypeScriptSetup.js:210:45)
at Object.<anonymous> (E:\Github\Web\so-rank\node_modules\react-scripts\scripts\start.js:31:1)
at Module._compile (internal/modules/cjs/loader.js:1138:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
at Module.load (internal/modules/cjs/loader.js:986:32)
at Function.Module._load (internal/modules/cjs/loader.js:879:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
error Command failed with exit code 1.
【问题讨论】:
【参考方案1】:这可以通过在tsconfig.json
中启用noFallthroughCasesInSwitch
选项来解决。有关更多信息,请参阅讨论 here。
"compilerOptions":
"noFallthroughCasesInSwitch": true,
...
,
...
对于任何好奇的人,上述解决方案并未修复该错误。它只是跳过运行下面的错误代码,如果未提供,则会将建议的值分配给 typescript 编译器选项。从react-scripts
生成的tsconfig.json
默认没有noFallthroughCasesInSwitch
选项。添加该选项无需运行代码。
// Some options when not present in the tsconfig.json will be assigned
// a suggested value which crashes the program
if (suggested != null)
if (parsedCompilerOptions[option] === undefined)
appTsConfig.compilerOptions[option] = suggested; // error here
...
编辑:
如果脚本因其他选项而崩溃,并且您的堆栈跟踪与我的问题中的相同,您应该检查您的 tsconfig.json
中是否缺少以下编译器选项
These 是在 tsconfig.json
中未指定时 Typescript 编译器选项的建议值
const compilerOptions =
// These are suggested values and will be set when not present in the
// tsconfig.json
target:
parsedValue: ts.ScriptTarget.ES5,
suggested: 'es5',
,
lib: suggested: ['dom', 'dom.iterable', 'esnext'] ,
allowJs: suggested: true ,
skipLibCheck: suggested: true ,
esModuleInterop: suggested: true ,
allowSyntheticDefaultImports: suggested: true ,
strict: suggested: true ,
forceConsistentCasingInFileNames: suggested: true ,
noFallthroughCasesInSwitch: suggested: true ,
module:
parsedValue: ts.ModuleKind.ESNext,
value: 'esnext',
reason: 'for import() and import/export',
,
moduleResolution:
parsedValue: ts.ModuleResolutionKind.NodeJs,
value: 'node',
reason: 'to match webpack resolution',
,
resolveJsonModule: value: true, reason: 'to match webpack loader' ,
isolatedModules: value: true, reason: 'implementation limitation' ,
noEmit: value: true ,
jsx:
parsedValue: ts.JsxEmit.React,
suggested: 'react',
,
paths: value: undefined, reason: 'aliased imports are not supported' ,
;
您需要将这些选项显式添加到您的tsconfig.json
,以便脚本可以跳过错误分支并避免崩溃。
【讨论】:
我会等待升级,直到他们解决这个问题。不想让我的 tsconfig 膨胀! 我将"noFallthroughCasesInSwitch": true,
添加到我的tsconfig.json
,但错误仍然出现?如何确保react-script start
真正使用我的tsconfig.json
?
我无法在我的设置中找到问题,因此我不得不使用create-react-app my-app --template typescript
重新设置我的项目。现在一切正常。【参考方案2】:
我申请了:
rm -rf yarn.lock
rm -rf tsconfig.json
然后我用命令yarn
重新安装。
最后,yarn start
。
这样我创建了新的默认文件tsconfig.json
和文件yarn.lock
。
【讨论】:
我这样做了,但是每次我停止服务器时它都不会重新启动,除非我删除 tsconfig.json 文件 ^ 通过删除我的所有依赖项然后重新添加它们来修复。【参考方案3】:当我尝试在我的 react 项目中开始使用 typescript 时,我遇到了完全相同的问题,什么解决了它在我的package.json
中使用具有这些特定版本的下一个包的问题
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "4.0.3",
"typescript": "^4.1.2",
还有这个tsconfig.json
文件
"compilerOptions":
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
,
"include": [
"src"
]
【讨论】:
以上是关于使用 typescript 模板将 create-react-app 更新到 4.0 时出错的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript 错误 2304:找不到名称 'div' - CRA TypeScript 模板
将 create-react-app 从 javascript 迁移到 typescript
create-react-app 可以与 TypeScript 一起使用吗
使用 typescript 在 create-react-app 中加载 sass