如何使用本地 npm 包中的 React 组件

jac*_*les 7 javascript npm reactjs webpack

我正在尝试使用一些 React 组件创建一个 npm 包,我几乎将其用于所有项目。这是文件夹结构和文件内容:

  • /
    • 距离/
      • 捆绑包.js
    • 源代码/
      • 我的组件.jsx
      • 索引.js
    • 包.json
    • webpack.config.js

我的组件.jsx

import React, { Component } from 'react';

class MyComponent extends Component {
    render() {
        return (
            <p>Hello, world!</p>
        );
    }
}

export default MyComponent;
Run Code Online (Sandbox Code Playgroud)

索引.js

// eventually there will be more components imported/exported here
import MyComponent from './MyComponent.jsx';
exports.MyComponent = MyComponent;
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

module.exports = {
    entry: './src/index.js',
    output: {
        path: './dist',
        filename: 'bundle.js'
    },
    // some loaders...
};
Run Code Online (Sandbox Code Playgroud)

包.json

{
    "name": "my-library",
    "files": [
        "dist",
        "src"
    ],
    "main": "dist/bundle.js",
    // the usual stuff...
}
Run Code Online (Sandbox Code Playgroud)

这是我对这个过程的理解。首先,我使用 webpack 构建 src 文件。它查看 /src/index.js,导入 MyComponent 类,然后导出它,使其可用作 MyComponent。这些都被添加到 /dist 中的 bundle.js 文件中。

接下来,我用npm pack. 这将创建一个存档文件,其中包含 /src 和 /dist 目录。

然后我转到我的另一个项目并运行npm install ../path/to/archive/file。这会将模块添加到我的 node_modules 目录中。问题是当我尝试导入和使用 MyComponent 时...

import React, { Component } from 'react';
import MyComponent from 'my-library';

class App extends Component {
    render() {
        console.log(<MyComponent />);
        return (
            <MyComponent />
        );
    }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

...并渲染该组件,我收到此警告和错误:

Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of `App`.

Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. Check the render method of `App`.
Run Code Online (Sandbox Code Playgroud)

console.log 的输出是一个 React 对象,但类型是Object,这似乎是警告所暗示的(我猜它应该是一个字符串)。

知道我缺少什么吗?


编辑:

嗯,我更接近了。我在 webpack 配置中添加了库选项:

output: {
    library: 'my-library',
    libraryTarget: 'umd'
}
Run Code Online (Sandbox Code Playgroud)

...然后我就可以像这样使用该组件:

import MyLibrary from 'my-library';
const MyComponent = MyLibrary.MyComponent;
Run Code Online (Sandbox Code Playgroud)

但我不想对每个组件都这样做。我的目标是这样的:

import { MyComponent, MyOtherComponent } from 'my-library';
Run Code Online (Sandbox Code Playgroud)

ank*_*aha 0

您必须从组件 index.js 文件导出组件,如下所示

import MyComponent from './MyComponent.jsx';
import MyOtherComponent from './MyOtherComponent.jsx';
export {
    MyComponent,
    MyOtherComponent
}
Run Code Online (Sandbox Code Playgroud)

然后在您的主项目中,使用导入它们

import { MyComponent, MyOtherComponent } from 'my-library';
Run Code Online (Sandbox Code Playgroud)