2017-02-16 194 views
2

我有一个通用的反应应用程序,其中服务器端建在babel和客户端软件包内置在webpack。我已阅读preact-compact文档和它表明在.babelrc添加此使用babel建设:迁移到preactjs

{ 
    "plugins": [ 
    [ 
     "transform-react-jsx", 
     { 
     "pragma": "h" 
     } 
    ], 
    [ 
     "module-resolver", 
     { 
     "root": [ 
      "." 
     ], 
     "alias": { 
      "react": "preact-compat", 
      "react-dom": "preact-compat" 
     } 
     } 
    ] 
    ], 
    "presets": [ 
    "react" 
    ] 
} 

而对于webpack

{ 
    "resolve": { 
    "alias": { 
     "react": "preact-compat", 
     "react-dom": "preact-compat" 
    } 
    } 
} 

但是建立后,我得到一个错误

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

回答

4

但建成后我得到一个错误“H没有定义”

您添加transform-react-jsx插件您通天配置。

["transform-react-jsx", { "pragma":"h" }] 

这告诉巴贝尔如何transpile您的JSX代码。为了达到这个目的,函数h需要位于范围内,这意味着您需要将其导入到每个使用JSX的文件中。

import { h } from 'preact'; 

而不必改变所有的代码,使用反应过来,就可以使用preact-compat和别名都reactreact-dompreact-compat,因为你做了正确的,无论是与babel-plugin-module-resolver或的WebPack。有了这个,你可以在你的代码中使用reactreact-dompreact-compat为你完成剩下的工作。

为了使其工作,您必须从您的babel配置中删除["transform-react-jsx", { "pragma":"h" }]

+0

在webpack config中添加别名仅解决客户端捆绑问题。但是因为它是一个通用应用程序,所以服务器端渲染代码以及使用babel捆绑在一起如何解决这个问题 – guru107

+1

好吧,现在我明白了为什么你为babel添加了'module-resolver'插件。你做的正确,你只需要移除'[“transform-react-jsx”,{“pragma”:“h”}]'和'preact-compat'将和webpack一样。 –

+0

是的@MichaelJungo是对的。 “pragma”:“h”是针对那些直接使用preact的人,而不是通过preact-compat。 –