在没有外部依赖的情况下,在 NPM 中发布 React 组件模块的正确方法是什么?
what is the proper way to publish a React component module in NPM without external dependencies inside?
我正在尝试在 NPM 中发布一个用 React 制作的组件库。
我不希望它具有外部依赖项,甚至是 React 模块,以具有尽可能小的文件大小,因为用户将在应用程序中添加此依赖项。
我正在使用 npm
和 webpack
来管理依赖项。
这是我的 package.json
依赖项:
"devDependencies": {
"webpack": "^1.13.1",
"webpack-dev-server": "^1.14.1",
"webpack-merge": "^0.13.0",
"babel-core": "^6.9.1",
"babel-loader": "^6.2.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babel-preset-react-hmre": "^1.1.1",
"react": "^15.0.2",
"react-dom": "^15.0.2"
},
"peerDependencies": {
"react": "^15.0.2",
"react-dom": "^15.0.2"
}
在我的 webpack.config.js
文件中,入口点为 'component.jsx',输出为 'lib.js' 文件
// Source code entry
entry: {
lib: './src/components/component.jsx'
},
// Code Output
output: {
path: PATHS.build,
filename: 'lib.js'
},
我还在反应模块中包含了 "externals" 属性,以避免 webpack 在 'lib.js' 输出中包含它。
externals: {
'react': 'React',
'react-dom' : 'ReactDOM'
}
最后这是我要发布的简单 React 组件:
import React from 'react';
export default class Component extends React.Component {
constructor() {
super();
}
render() {
return (
<h1>MY COMPONENT</h1>
);
}
}
我把它发布到 NPM 并安装在另一个项目中。当我在导入 React 语句后尝试使用它时,它给我一个错误,指出 React 未定义(bundle.js:28448 Uncaught ReferenceError: React is not defined)
我探测组件的代码:
import React from 'react';
import ReactDOM from 'react-dom';
import Component from 'component';
import $ from 'jquery';
ReactDOM.render(
<Component />,
$("#app")
);
我是否遗漏了依赖项配置中的任何内容?
谢谢
您将输出文件设为 lib.js
,但在渲染时您正在读取 bundle.js
。请将输出文件重命名为 bundle.js
或在 index.html
中包含 lib.js
以代替包含 bundle.js
.
Webpack externals
默认为您的 libraryTarget
。这意味着如果你不指定任何东西,它会将外部输出为 var
,并将其作为全局变量。
Webpack输出使用全局:
/* 76 */
/***/ function(module, exports) {
module.exports = react;
/***/ },
您需要告诉它在已安装的模块中查找依赖项(对 require
它)。为此,请将您的外部设置更改为:
需要更改(webpack.config):
externals: {
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
}
然后使用commonjs输出。
使用commonjs的Webpack输出:
/* 76 */
/***/ function(module, exports) {
module.exports = require('react');
/***/ },
请注意,我将您的外部变量改回小写,因为该值应该是要查找的依赖项名称(在这种情况下,react
和 react-dom
)。
(顺便说一句,如果你不想捆绑任何 node_module,我建议使用 webpack-node-externals)
我写了一篇完整的 Medium 故事,因为我遇到了和你一样的问题,但没有相关信息。
检查一下:https://medium.com/@BrodaNoel/how-to-create-a-react-component-and-publish-it-in-npm-668ad7d363ce
主要修复是在 webpack.config.js 文件中添加外部 'react': 'commonjs react'
我正在尝试在 NPM 中发布一个用 React 制作的组件库。
我不希望它具有外部依赖项,甚至是 React 模块,以具有尽可能小的文件大小,因为用户将在应用程序中添加此依赖项。
我正在使用 npm
和 webpack
来管理依赖项。
这是我的
package.json
依赖项:"devDependencies": { "webpack": "^1.13.1", "webpack-dev-server": "^1.14.1", "webpack-merge": "^0.13.0", "babel-core": "^6.9.1", "babel-loader": "^6.2.4", "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "babel-preset-react-hmre": "^1.1.1", "react": "^15.0.2", "react-dom": "^15.0.2" }, "peerDependencies": { "react": "^15.0.2", "react-dom": "^15.0.2" }
在我的
webpack.config.js
文件中,入口点为 'component.jsx',输出为 'lib.js' 文件// Source code entry entry: { lib: './src/components/component.jsx' }, // Code Output output: { path: PATHS.build, filename: 'lib.js' },
我还在反应模块中包含了 "externals" 属性,以避免 webpack 在 'lib.js' 输出中包含它。
externals: { 'react': 'React', 'react-dom' : 'ReactDOM' }
最后这是我要发布的简单 React 组件:
import React from 'react'; export default class Component extends React.Component { constructor() { super(); } render() { return ( <h1>MY COMPONENT</h1> ); } }
我把它发布到 NPM 并安装在另一个项目中。当我在导入 React 语句后尝试使用它时,它给我一个错误,指出 React 未定义(bundle.js:28448 Uncaught ReferenceError: React is not defined)
我探测组件的代码:
import React from 'react'; import ReactDOM from 'react-dom'; import Component from 'component'; import $ from 'jquery'; ReactDOM.render( <Component />, $("#app") );
我是否遗漏了依赖项配置中的任何内容?
谢谢
您将输出文件设为 lib.js
,但在渲染时您正在读取 bundle.js
。请将输出文件重命名为 bundle.js
或在 index.html
中包含 lib.js
以代替包含 bundle.js
.
Webpack externals
默认为您的 libraryTarget
。这意味着如果你不指定任何东西,它会将外部输出为 var
,并将其作为全局变量。
Webpack输出使用全局:
/* 76 */
/***/ function(module, exports) {
module.exports = react;
/***/ },
您需要告诉它在已安装的模块中查找依赖项(对 require
它)。为此,请将您的外部设置更改为:
需要更改(webpack.config):
externals: {
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
}
然后使用commonjs输出。
使用commonjs的Webpack输出:
/* 76 */
/***/ function(module, exports) {
module.exports = require('react');
/***/ },
请注意,我将您的外部变量改回小写,因为该值应该是要查找的依赖项名称(在这种情况下,react
和 react-dom
)。
(顺便说一句,如果你不想捆绑任何 node_module,我建议使用 webpack-node-externals)
我写了一篇完整的 Medium 故事,因为我遇到了和你一样的问题,但没有相关信息。 检查一下:https://medium.com/@BrodaNoel/how-to-create-a-react-component-and-publish-it-in-npm-668ad7d363ce
主要修复是在 webpack.config.js 文件中添加外部 'react': 'commonjs react'