2016-01-10 35 views
9

在我以前的Meteor應用程序中,使用browserify和React,所有工作都在工作,直到我切換到meteor webpack如何防止加載多個副本的反應?

我用我的流星應用react-select和它的工作很好,但與browserify我能阻止反應的多個副本加載因而避免了這種錯誤,現在我有:

Error: Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's render method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).

我的package.json看看這個:

... 

"dependencies": { 
    "classnames": "^2.1.3", 
    "lodash": "^3.10.0", 
    "react": "^0.14.6", 
    "react-dom": "^0.14.6", 
    "react-mixin": "^2.0.1", 
    "react-select": "^1.0.0-beta8" 
    }, 

... 

有沒有在webpack中的配置我可以使用一些調用外部的東西?不能完全肯定這意味着什麼,但評論說,使用方法:

externals: { 
    'react': 'React', 
    'react-dom': 'ReactDOM' 
} 
+0

看起來像使用反應的多個版本。 stackoverflow.com/questions/34236426/how-to-fix-react-error-uncaught-error-invariant-violation-addcomponentasrefto/34358537#34358537 – Manivannan

回答

5

由於您使用的WebPack,你可以添加一個別名裝載反應,就像這樣:

// In webpack.config.js 

    resolve: { 
    alias: { 
     react: path.resolve('node_modules/react'), 
    }, 
    }, 

這防止​​錯誤使我們的構建再次成功。但是,由於某些原因,測試版本僅在我們的CI環境中失敗,因爲它無法解決node_modules/react路徑。不過,我認爲你不太可能會遇到這個特殊的問題。

+1

這個解決方案救了我!謝謝。 – JoshJ

1

一種適合我的工作是:

卸載所有反應有關全球已安裝的軟件包(創建反應的應用程序內,反應本地的,反應等)

則:rm -rf node_modules

那麼:使用npm install代替紗線安裝

考慮一個應用程序與板條箱反應的應用內創建並噴出

0

在我的情況下,我建立了一個單獨的npm模塊,然後將其作爲一個庫在另一個項目中使用npm link ../some-library。當我運行父項目時,該庫中的一個模塊導致了此錯誤。

當我遇到這個錯誤時,對於我來說,解決方案是通過將下列內容添加到其webpack.config.js的module.exports中來防止反應和react-dom被包含在some-library bundle輸出中:

externals: { 
    react: 'react', 
    'react-dom': 'react-dom' 
} 
相關問題