迁移到 preactjs

gur*_*107 5 reactjs webpack babeljs preact

我有一个通用的 React 应用程序,其中服务器端内置于 babel 中,客户端包内置于webpack. 我已阅读preact-compact文档,并建议将其添加到.babelrc构建中babel

{
  "plugins": [
    [
      "transform-react-jsx",
      {
        "pragma": "h"
      }
    ],
    [
      "module-resolver",
      {
        "root": [
          "."
        ],
        "alias": {
          "react": "preact-compat",
          "react-dom": "preact-compat"
        }
      }
    ]
  ],
  "presets": [
    "react"
  ]
}
Run Code Online (Sandbox Code Playgroud)

而对于webpack

{
  "resolve": {
    "alias": {
      "react": "preact-compat",
      "react-dom": "preact-compat"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是在构建后我得到一个错误 h is not defined

如何迁移到preact通用反应应用程序

Mic*_*ngo 5

但是在构建后我收到一个错误“h 未定义”

您已将该transform-react-jsx插件添加到您的 babel 配置中。

["transform-react-jsx", { "pragma":"h" }]
Run Code Online (Sandbox Code Playgroud)

这告诉 babel 如何转译你的 JSX 代码。为此,该函数h需要在范围内,这意味着您需要在使用 JSX 的每个文件中导入它。

import { h } from 'preact';
Run Code Online (Sandbox Code Playgroud)

不必更改所有使用 React 的代码,您可以使用preact-compatreactreact-dom为和to 设置别名preact-compat,正如您在babel-plugin-module-resolverwebpack 中所做的那样。有了它,您可以在代码中使用react和 并react-dom为您preact-compat完成其余的工作。

为了让它工作,你必须["transform-react-jsx", { "pragma":"h" }]从你的 babel 配置中删除。

  • 好的,现在我明白你为什么为 babel 添加 `module-resolver` 插件了。你这样做是正确的,你只需要删除 `["transform-react-jsx", { "pragma":"h" }]` 和 `preact-compat` 将与 webpack 相同。 (2认同)