导入自定义npm包导致空/ null对象

时间:2016-03-08 18:45:01

标签: reactjs npm ecmascript-6 webpack

我可以在同一个包中导入MyComponent并让它在页面上呈现,但是我无法链接或下载MyComponent包并导入组件。

的package.json:

{
  "name": "my-component",
  "version": "1.0.0",
  "main": "dist/index.js",
  "directories": {},
  "dependencies": {},
  "devDependencies": {
    "babel-loader": "^6.2.3",
    "babel-preset-es2015": "",
    "babel-preset-react": "",
    "css": "^2.2.1",
    "css-loader": "^0.23.1",
    "file-loader": "^0.8.5",
    "node-sass": "^3.4.2",
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "sass": "^0.5.0",
    "sass-loader": "^3.1.2",
    "style": "0.0.3",
    "style-loader": "^0.13.0",
    "webpack": "^1.12.13",
    "webpack-dev-server": "^1.14.1"
  }
}

webpack.config.js:

var path = require('path');

module.exports = {
  entry: './src/MyComponent.jsx',
  output: {
    path: './dist/',
    filename: './index.js'
  },
  module: {
    loaders: [{
      test: /\.jsx$/,
      include: path.resolve(__dirname),
      exclude: /node_modules/,
      loader: 'babel-loader',
      query: {
        presets: ['react', 'es2015']
      }
    },
    {
      test: /\.scss$/,
      include: /.scss$/,
      loader: 'style!css!sass'
    },
    {
      test: /\.html$/,
      loader: "file?name=[name].[ext]",
    },]
  }
};

./ SRC / MyComponent.jsx

import React from 'react';

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div>Hello World.</div>
    );
  }
}

MyComponent.propTypes = {
  class: React.PropTypes.string
}
MyComponent.defaultProps = {
  class: ''
}

console.log(MyComponent)

使用webpack dev服务器,我可以将该组件导入另一个文件并将其呈现给页面。

当我在另一个项目中链接和/或安装webpack build的结果时,我希望能够做到这一点,如下所示:

新app.jsx:

import React from 'react'
import ReactDOM from 'react-dom'
import MyComponent from 'my-component'
console.log(MyComponent)
ReactDOM.render(MyComponent, document.body)

当我从'my-component'导入模块时,MyComponent.jsx中存在的console.log语句按预期记录“function MyComponent(props){...”,但是新的console.log语句应用程序记录一个空对象。

渲染new-app.jsx时的

控制台输出:我相信第一个日志是来自MyComponent.jsx的日志,第二个日志来自我的新应用程序。

index.js:19783 MyComponent(props) {
            _classCallCheck(this, MyComponent);

            return _possibleConstructorReturn(this, Object.getPrototypeOf(MyComponent).call(this, props));
          }
index.js:58 Object {}

我在配置中遗漏了什么?我是否以错误的方式导出/导入?

3 个答案:

答案 0 :(得分:12)

解决方案是将此添加到webpack.config.js

的输出中
library: 'MyComponent',
libraryTarget: 'umd'

答案 1 :(得分:0)

我有类似的问题

import {MySingleton} from "../../../dist/my-bundle-webpack-package";

MySingleton.instance.foo();

错误:

Cannot read property 'instance' of undefined

我的软件包文件的index.ts是:

export class MySingleton{
   ...
}
module.exports = MySingleton;

该问题的解决方案是删除module.exports

export class MySingleton{
   ...
}

答案 2 :(得分:0)

添加 libraryTarget: 'umd' 在这里没有帮助。

我在尝试通过 npm link 使用 npm 包作为库时遇到了一些问题。在我的案例中,罪魁祸首是对两个项目的重复依赖 - Project 和 Lib 正在导入相同的模块。 Webpack 在这里静默失败。

通过在 Lib 中将 "externals" 添加到我的 webpack 配置中以告诉这些包将存在于项目中来修复它

externals: {
    "pixi.js": "pixi.js",
    immer: "immer",
    redux: "redux",
    lodash: "lodash",
    gsap: "gsap",
  },