как правильно опубликовать модуль компонента React в NPM без внешних зависимостей внутри?
Я пытаюсь опубликовать в 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" }
-
в своем у меня есть точка входа как компонент.jsx "и выводится как" lib.файл js
// Source code entry entry: { lib: './src/components/component.jsx' }, // Code Output output: { path: PATHS.build, filename: 'lib.js' },
-
Я также включил атрибут "externals" с модулями react, чтобы избежать включения 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 и установил его в другом проекте. Когда я попытался использовать его после инструкции Import 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") );
Я что-то пропустил в конфигурации зависимостей?
спасибо
3 ответов
Webpack externals
значения по умолчанию для libraryTarget
. Это означает, что если вы ничего не укажете, он выведет внешний as var
, и exepcts это глобальная переменная.
вывод Webpack с помощью global:
/* 76 */
/***/ function(module, exports) {
module.exports = react;
/***/ },
вам нужно сказать ему, чтобы искать зависимость в установленных модулях (до require
его). для этого измените внешние параметры на:
требуемое изменение (в webpack.config):
externals: {
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
}
и затем он выведет его с помощью commonjs.
вывод Webpack с помощью commonjs:
/* 76 */
/***/ function(module, exports) {
module.exports = require('react');
/***/ },
ссылка документы webpack здесь.
обратите внимание, что я изменил ваши внешние значения обратно в нижний регистр, так как значение должно быть именем зависимости для поиска (в этом случае, react
и react-dom
).
(кстати, если вы не хотите связывать какой-либо node_module, я рекомендуем использовать webpack-узел-экстрималов)
вы делаете выходной файл как lib.js
но во время рендеринга Вы читаете bundle.js
. Переименуйте любой выходной файл как bundle.js
или включить lib.js
в своем index.html
в том числе bundle.js
.
Я написал Полный рассказ, потому что у меня была та же проблема, что и у вас, и нет никакой информации об этом. Проверьте это: https://medium.com/@BrodaNoel/how-to-create-a-react-component-and-publish-it-in-npm-668ad7d363ce
основное исправление-добавить внешний 'react': 'commonjs react'
в webpack.конфиг.файл JS