ldo*_*doc 8 dependencies components npm reactjs
我正在尝试在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"
}
Run Code Online (Sandbox Code Playgroud)在我的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'
},
Run Code Online (Sandbox Code Playgroud)我还在反应模块中包含了"externals"属性,以避免webpack包含在'lib.js'输出中.
externals: {
'react': 'React',
'react-dom' : 'ReactDOM'
}
Run Code Online (Sandbox Code Playgroud)最后,这是我想要发布的简单React组件:
import React from 'react';
export default class Component extends React.Component {
constructor() {
super();
}
render() {
return (
<h1>MY COMPONENT</h1>
);
}
}
Run Code Online (Sandbox Code Playgroud)我将它发布到NPM并将其安装在另一个项目中.当我在导入React语句后尝试使用它时,它给出了一个错误,指出React未定义(bundle.js:28448 Uncaught ReferenceError:React未定义)
我的代码探测组件:
import React from 'react';
import ReactDOM from 'react-dom';
import Component from 'component';
import $ from 'jquery';
ReactDOM.render(
<Component />,
$("#app")
);
Run Code Online (Sandbox Code Playgroud)我在依赖项配置中遗漏了什么吗?
谢谢
Webpackexternals
默认为您的libraryTarget
. 这意味着如果您不指定任何内容,它将输出外部 as var
,并例外它是一个全局变量。
使用全局的 Webpack 输出:
/* 76 */
/***/ function(module, exports) {
module.exports = react;
/***/ },
Run Code Online (Sandbox Code Playgroud)
您需要告诉它在已安装的模块中查找依赖项(对其require
)。为此,请将您的外部更改为:
所需的更改(在 webpack.config 中):
externals: {
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
}
Run Code Online (Sandbox Code Playgroud)
然后它会使用commonjs输出它。
使用 commonjs 的 Webpack 输出:
/* 76 */
/***/ function(module, exports) {
module.exports = require('react');
/***/ },
Run Code Online (Sandbox Code Playgroud)
请注意,我将您的外部更改回小写,因为该值应该是要查找的依赖项名称(在这种情况下为react
和react-dom
)。
(顺便说一下,如果你不想捆绑任何node_module,我建议使用webpack-node-externals)