【问题标题】:Ionic React Typescript with pug.js, 'Uncaught ReferenceError: React is not defined' when use tsx but not jsx带有 pug.js 的 Ionic React Typescript,使用 tsx 而不是 jsx 时出现“未捕获的 ReferenceError:React 未定义”
【发布时间】:2021-03-11 14:31:05
【问题描述】:

问题:react-app-rewired start 适用于 App.jsx(和 .js),但不适用于 App.tsx(和 .ts)

步骤

  1. 我用ionic start my-app blank --type=react --capacitor 创建了一个样板应用程序
  2. 在 package.json 上,我相应地替换并重新安装(删除 package.lock.json,npm i
{
    "name": "my-app",
    "version": "0.0.1",
    "private": true,
    "scripts": {
-       "start": "ionic serve",
+       "start": "react-app-rewired start",
-       "build": "ionic build",
+       "build": "react-app-rewired build",
        "test": "react-scripts test"
    },
    "dependencies": {
        "@capacitor/android": "^2.4.3",
        "@capacitor/core": "2.4.3",
        "@ionic/react": "^5.0.7",
        "@ionic/react-router": "^5.0.7",
        "ionicons": "^5.0.0",
        "react": "^16.13.0",
        "react-dom": "^16.13.0",
        "react-router": "^5.1.2",
        "react-router-dom": "^5.1.2",
+       "babel-plugin-transform-react-pug": "^7.0.1",
+       "customize-cra": "^1.0.0",
+       "react-app-rewired": "^2.1.6",
    },
    "devDependencies": {
        "@capacitor/cli": "2.4.3",
        "@ionic/cli": "6.12.2",
        "@testing-library/jest-dom": "^4.2.4",
        "@testing-library/react": "^9.4.0",
        "@testing-library/user-event": "^8.0.3",
        "@types/jest": "^24.0.25",
        "@types/node": "^12.12.24",
        "@types/react": "^16.9.17",
        "@types/react-dom": "^16.9.4",
        "@types/react-router": "^5.1.4",
        "@types/react-router-dom": "^5.1.3",
        "react-scripts": "3.4.0",
        "typescript": "3.8.3"
    },
    "eslintConfig": {
        "extends": "react-app"
    },
    "browserslist": {
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ],
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    },
    "description": "An Ionic project"
  1. 在项目的根文件夹中添加config-overrides.js文件
const { override, disableEsLint, addBabelPlugin } = require('customize-cra')

module.exports = override(
    disableEsLint(),
    addBabelPlugin('transform-react-pug'),
)
  1. 将 App.tsx 替换为
import React from 'react'
import {
    IonApp,
    IonContent,
    IonHeader,
    IonTitle,
    IonToolbar,
} from '@ionic/react'

declare const pug: any
const App: React.FC = () => {
    return pug`
        IonApp
            IonHeader
                IonToolbar
                    IonTitle My App
            IonContent.ion-padding Add some content here…
    `
}
export default App

  1. 开启tsconfig.json 设置"strict": false
  2. 项目根文件夹中的npm start(或react-app-rewired start

终端上没有错误('编译成功!'),chrome 屏幕是空白的,在 chrome 控制台上:

Uncaught ReferenceError: React is not defined
    at App (main.chunk.js:33)
    ...

奇怪的是,如果我用 .jsx 或 .js 而不是 .tsx 或 .ts 更改应用程序扩展名,该应用程序可以正常工作

pug 设置也适用于设置 CRA 打字稿应用而不是 ionic start --type=react --capacitor 应用

编辑: 这是工作/不工作 repo 的 github https://github.com/calvindio/template-ionic-react-ts-pug

【问题讨论】:

  • 我猜是webpack的问题,设置严格模式为true,另外,APP()函数没有类型,确保你给这个函数设置了正确的类型
  • 我也尝试将严格模式设置为 true,结果相同。并且没有打字稿错误。我还没有理解 webpack。因为我避免弹出应用程序,所以我使用 react-app-rewired、custom-cra 和 babel-plugin-transform-react-pug 作为解决方法
  • 我在 tsx 中也输入了const App: React.FC = () => {...。同样的错误。
  • 在你有 2 个启动命令和 2 个构建的包中,删除其中一个
  • 这是我用来表示我将"start": "ionic serve", 替换为"start": "react-app-rewired start", (CMIIW) 的符号。我只使用“react-app-rewired”版本来启动和构建。谢谢你这么用心。

标签: reactjs typescript pug capacitor ionic-react


【解决方案1】:

问题

看起来问题来自 tsc 删除了导致问题的未使用导入。

例如,这行 import React from 'react' 不会包含在编译代码中,因为您没有以 jsx 格式返回。

同样,像import { IonApp, ... } from '@ionic/react'; 这样的所有导入也不会包含在编译代码中。这就是webpack 无法正确映射React 导入的原因。

解决方案

据我了解,我还知道tsc 的任何选项仍会将未使用的导入保留在构建的代码中。如果您能找到该选项,那就太好了。

但现在,您可以使用 require 关键字来解决问题,该关键字可以保持导入:

App.tsx

const React = require('react');
const { IonApp, ... } = require('@ionic/react');

// ...

【讨论】:

  • 哇,解决了!谢谢!你的解释很有道理。我想知道是否有使用require 而不是import 的自动导入vscode 扩展。再次感谢您!
  • 对于那些将来阅读的人:您可以结合使用普通的自动导入扩展和使用 import-to-require-converter (marketplace.visualstudio.com/…)
  • 我仍然热衷于继续使用esnext 样式,这意味着使用import,但是我们可以配置为允许未使用的导入来处理这种情况(这都与tsc 有关)
  • 使用了一天,我也很想用import。手动将自动import 转换为const require 的数量很多。是 tsconfig 里的东西吗?
  • 您能否尝试研究如何在 Typescript 中保留未使用的导入,可在此处获得 typescriptlang.org/docs/handbook/compiler-options.html?或者只要你能以某种方式在你使用 pug 作为模板的地方使用你的导入,那么它就可以正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2017-05-14
  • 2019-02-28
相关资源
最近更新 更多