2017-02-16 20 views
2

私は、サーバ側がbabelで構築され、クライアントバンドルがwebpackで構築されている汎用の反応アプリを持っています。どのようにpreactjsへの移行

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

しかし、構築した後、私はエラーを取得する:私はpreact-compactドキュメントを読んでいると、それはbabelを使用して構築するための.babelrcでこれを追加することを提案:

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

webpack用普遍的な反応アプリの場合preactに移動

答えて

4

しかし、構築した後、私はエラーを取得する

を「時間が定義されていない」あなたはあなたのバベルの設定にtransform-react-jsxプラグインを追加しました。

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

これは、JSXコードをトランスバイルする方法をバベルに伝えます。それが機能するには、関数hが有効である必要があります。つまり、JSXを使用するすべてのファイルでインポートする必要があります。あなたがbabel-plugin-module-resolverまたはWebPACKのいずれかで、正しくなかったとして代わりにリアクト使用するすべてのコードを変更することの

import { h } from 'preact'; 

、あなたは、preact-compatpreact-compatとエイリアスreactreact-domの両方を使用することができます。それでreactreact-domをコードに使用し、preact-compatがあなたのために残ります。

動作させるには、["transform-react-jsx", { "pragma":"h" }]をあなたのバベルの設定から削除する必要があります。

+0

webpack configにエイリアスを追加すると、クライアントバンドルの問題のみが解決されます。しかし、普遍的なアプリケーション以来、サーバー側のレンダリングコードも同様にその問題に近づくためにどのようにバベルを使用してバンドルされます – guru107

+1

今、私はあなたがbabelのための 'module-resolver'プラグインを追加したのを見ます。これを正しく実行しただけで、 '[" "transform-react-jsx"、{"pragma": "h"}] 'を削除する必要があり、' preact-compat'はwebpackと同様に動作します。 –

+0

うん、@MichaelJungoが正しい。 "pragma": "h"はpreact-compatではなく、preactを直接使用する人のためのものです。 –