2016-08-18 41 views
4

我目前正在抨击我的头。我在这里制作了一个小反应组件https://github.com/brettjthom/react-basic-table,该组件使用webpack进行捆绑。它的工作原理与自给自足的例子,但只要我试图将其导入到另一个项目喜欢这里https://github.com/brettjthom/react-basic-table-test,它失败,出现错误反应webpack设置 - 不能调用一个类作为功能

Cannot call a class as a function 

在哪里出了错任何想法?

Webpack为主要组件。

var webpack = require('webpack'); 

// Options for Builds 
var buildVar = process.argv.indexOf('-var') > -1; 
var minify = process.argv.indexOf('-p') > -1; 

// Different build types 
var outputName = 'lib/react-basic-table'; 
outputName = outputName + (buildVar ? '-var' : ''); 
outputName = outputName + (minify ? '.min.js' : '.js'); 


var plugins = [ 
    new webpack.optimize.DedupePlugin() 
] 
if (minify) plugins.push(new webpack.optimize.UglifyJsPlugin()); 


module.exports = { 
    entry: './src/index.jsx', 

    module: { 
    preLoaders: [ 
     { test: /\.jsx?$/, include: /src/, loaders: ['eslint?{fix:true}']} 
    ], 
    loaders: [ 
     { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel', query: { 
     presets: ['react', 'es2015'], 
     plugins: ["add-module-exports", "transform-es2015-modules-umd"] 
     } } 
    ] 
    }, 

    externals: [{ 
    "react": { 
     root: "React", 
     commonjs2: "react", 
     commonjs: "react", 
     amd: "react" 
    } 
    }], 

    output: { 
    filename: outputName, 
    libraryTarget: buildVar ? 'var' : 'umd', 
    library: 'ReactBasicTable' 
    }, 

    plugins: plugins, 

    eslint: { 
     failOnWarning: false, 
     failOnError: true, 
     configFile: './.eslintrc.js' 
    }, 

    resolve: { 
    extensions: ['', '.jsx', '.js'] 
    } 
}; 

的package.json为主要成分

{ 
    "name": "react-basic-table", 
    "version": "1.0.3", 
    "description": "", 
    "main": "./lib/react-basic-table.js", 
    "dependencies": { 
    "react": "^0.13.3", 
    "classnames": "^2.1.5", 
    "underscore": "^1.8.3" 
    }, 
    "devDependencies": { 
    "babel": "^5.8.23", 
    "babel-core": "^6.13.2", 
    "babel-loader": "^6.2.4", 
    "babel-plugin-add-module-exports": "^0.2.1", 
    "babel-plugin-transform-es2015-modules-umd": "^6.12.0", 
    "babel-preset-es2015": "^6.13.2", 
    "babel-preset-react": "^6.11.1", 
    "bootstrap": "^3.3.7", 
    "eslint": "~2.11.1", 
    "eslint-config-airbnb": "~9.0.1", 
    "eslint-import-resolver-webpack": "~0.4.0", 
    "eslint-loader": "~1.3.0", 
    "eslint-plugin-import": "~1.12.0", 
    "eslint-plugin-jsx-a11y": "~1.3.0", 
    "eslint-plugin-react": "~5.1.1", 
    "webpack": "^1.12.2" 
    }, 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1", 
    "build-all": "node ./node_modules/webpack/bin/webpack.js && node ./node_modules/webpack/bin/webpack.js -p -d && node ./node_modules/webpack/bin/webpack.js -var -p -d && node ./node_modules/webpack/bin/webpack.js --config webpack.config.example.js", 
    "build": "node ./node_modules/webpack/bin/webpack.js && node ./node_modules/webpack/bin/webpack.js -p -d && node ./node_modules/webpack/bin/webpack.js -var -p -d", 
    "watch": "node ./node_modules/webpack/bin/webpack.js --watch", 
    "build-example": "node ./node_modules/webpack/bin/webpack.js --config webpack.config.example.js", 
    "watch-example": "node ./node_modules/webpack/bin/webpack.js --config webpack.config.example.js --watch", 
    "lint": "eslint --fix ./src/**" 
    }, 
    "author": "Brett Thom", 
    "license": "MIT", 
    "repository": { 
    "type": "git", 
    "url": "https://github.com/brettjthom/react-basic-table.git" 
    } 
} 

的WebPack对于示例

var webpack = require('webpack'); 

var config = { 
    entry: './index.jsx', 
    output: {filename: 'bundle.js'}, 
    resolve: { 
     extensions: ['', '.js', '.jsx'] 
    }, 
    module: { 
     loaders: [{ 
      test: /\.jsx?$/, 
      exclude: /(node_modules)/, 
      loaders: [ 
       'babel-loader?presets[]=react,presets[]=es2015', 
      ] 
     }] 
    }, 
    plugins: [] 
} 

module.exports = config; 

的package.json例如

{ 
    "name": "test-table", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.jsx", 
    "scripts": { 
    "build": "node ./node_modules/webpack/bin/webpack.js" 
    }, 
    "devDependencies": { 
    "webpack": "~1.13.1", 
    "babel-loader": "~6.2.4", 
    "babel-preset-react": "~6.5.0", 
    "babel-preset-es2015": "~6.9.0", 
    "babel-core": "~6.9.1" 
    }, 
    "dependencies": { 
    "react": "~15.1.0", 
    "react-dom": "~15.1.0", 
    "react-basic-table": "^1.0.4" 
    }, 
    "author": "", 
    "license": "ISC" 
} 

由于

+0

当然,你没有读[问]。 – Amit

+0

@Teemu感谢您的反馈!我将这个webpacks从git仓库添加到主帖子中。 –

回答

3

更新

https://github.com/brettjthom/react-basic-table/blob/master/package.json线7

"react": "~15.1.0", // from "^0.13.3" 

重新构建库。然后它工作。

React 0.14+在api中有一些剧烈的变化。

+0

您应该可以通过NPM依赖关系的名称来引用它,我相信。 –

+0

但是,这是有帮助的。为了试试这个,我直接引用了node_modules中的库的路径。它不起作用。将它从node_modules拉到另一个路径上工作...也许是用babel的东西? –

+0

@BrettThom'react-basic-table' npm包不包含index.js和index.d.ts,所以它不能通过包名自动提取。如果使用webpack-dev-server,则不能直接引用insdie node_modules的路径,因为不包括node_modules。因此,将其复制到您自己的源代码树中是目前唯一的方法。 –

0

我有一个类似的问题,我想将React组件导入到非React应用程序中。

我所做的就是让webpack将React组件捆绑为一个库。在这种情况下的WebPack配置的输出部分可以是这样的:

output: { 
    path: './assets/javascripts/build/', 
    filename: 'MyTableComponent.js', 
    libraryTarget: 'umd', 
    library: 'MyTableComponent', 
    umNamedDefine: true 
} 

的入口点的组分包含类为主要阵营成分,以及使用ReactDom一个init()方法来安装部件到一个DOM节点。因此,例如,一个假想的表组件,切入点是的WebPack配置可能包含这样的事情:

import React from 'react' 
import ReactDOM from 'react-dom' 

class MyTableComponent extends React.Component { 

    render() { } 

} 

// Now the method that will mount this component 
function init(container, props) { 
    let component = (
    <EmbeddedViewer props={props} /> 
) 

    ReactDOM.render(component, container) 
} 

// Just export the init() method 
export { init } 

最后,只要你想使用的组件,调用init方法。在这个例子中,我用它标记中:对的WebPack输出配置

<script type="text/javascript" src="{{ base_url('assets/javascripts/build/MyTableComponent.js') }}"></script> 
<script > 
    document.addEventListener('DOMContentLoaded', ready, false); 

    function ready() { 
    var container = document.getElementById('container') 
    MyTableComponent.init(container, {}) 
    } 
</script> 

更多信息,可以发现here

祝你好运!