У меня есть довольно простой пример виджета React Hooks, функция которого заключается в предоставлении контекстных хуков для предоставления состояния, которое может устанавливать несколько строк и переключать текущую тему Material UI. Вот рабочая демоверсия . Нажав на кнопку с надписью «СЛЕДУЮЩАЯ ТЕМА», вы увидите, что страница переключается между желтым и синим цветом, а также некоторые изменения текста, указывающие название темы.
Это надуманный пример, но идея в том, что в верхней части моего сайта я обертываю весь контент провайдерами контекста, чтобы любой вложенный виджет мог получить доступ к общему состоянию. Выглядит так:
import React from "react";
import { AppContext } from "./AppContext";
import { ThemeContextProvider } from "./ThemeContext";
export default function App(props) {
return (
<div>
<ThemeContextProvider>
<AppContext>{props.children}</AppContext>
</ThemeContextProvider>
</div>
);
}
Все работает, как я сказал в демонстрации, которую я связал выше. Но когда я публикую sh этот код на NPM и затем использую его в другом проекте, он в основном работает, за исключением одного фрагмента импорта - цвет темы не изменится. Все остальные изменения состояния работают правильно - все остальные изменения состояния являются текстовыми и проблем не возникает, но цвет не изменится.
Тема предоставляется пользовательским интерфейсом материалов, и я подозреваю, что существует проблема с тем, что я собираю весь этот код для публикации в NPM. Я использую Rollup - вот rollup.config. js:
import babel from 'rollup-plugin-babel';
import commonjs from 'rollup-plugin-commonjs';
import external from 'rollup-plugin-peer-deps-external';
import resolve from 'rollup-plugin-node-resolve';
import json from '@rollup/plugin-json';
const {terser} = require('rollup-plugin-terser');
import pkg from './package.json';
export default {
input: 'src/index.js',
output: [
{
file: pkg.main,
format: 'cjs',
sourcemap: true
},
{
file: pkg.module,
format: 'es',
sourcemap: true
}
],
plugins: [
external(),
// url({ exclude: ['**/*.svg'] }),
babel({
exclude: 'node_modules/**',
runtimeHelpers: true
}),
resolve({
preferBuiltins: true,
browser: true
}),
commonjs({
include: 'node_modules/**',
browser: true,
namedExports: {
'node_modules/react/index.js': [
'createContext',
'useContext',
'useEffect',
'useState'
],
'node_modules/react-is/index.js': [
'ForwardRef',
'Memo'
],
'node_modules/prop-types/index.js': [
'elementType'
]
}
}),
terser(),
json()
]
};
А вот мой пакет. json:
{
"name": "@data-factory/theme-context-test",
"version": "0.0.1",
"description": "Code from CodeSandbox",
"author": "sellis42",
"main": "dist/index.js",
"module": "dist/index.es.js",
"jsnext:main": "dist/index.es.js",
"engines": {
"node": ">=8",
"npm": ">=5"
},
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "rollup -c",
"start": "rollup -c -w",
"prepare": "npm run build",
"predeploy": "cd example && npm install && npm run build"
},
"peerDependencies": {
"react": "^16.12.0",
"react-dom": "^16.12.0"
},
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.0",
"@babel/preset-react": "^7.0.0",
"@babel/runtime": "^7.9.2",
"@material-ui/core": "^4.9.8",
"@material-ui/icons": "^4.9.1",
"@material-ui/styles": "^4.9.6",
"@rollup/plugin-json": "^4.0.2",
"cross-env": "^5.2.0",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-scripts": "^3.4.0",
"rollup": "^1.32.1",
"rollup-plugin-babel": "^4.4.0",
"rollup-plugin-commonjs": "^9.3.4",
"rollup-plugin-node-resolve": "^4.2.4",
"rollup-plugin-peer-deps-external": "^2.2.2",
"rollup-plugin-terser": "^4.0.4",
"typeface-roboto": "0.0.75"
}
}
Я чувствую, что есть чего-то не хватает в моей конфигурации накопительного пакета. Этот проект находится в моей локальной системе разработки и немного отличается от связанного кода. По сути, у меня есть весь код, который я публикую sh в root модуля виджета, и пример папки, которая демонстрирует, как использовать виджет. Я использую ссылку npm, чтобы примерный виджет мог использовать ее, и именно здесь я вижу проблему, которую пытаюсь решить. Я могу скопировать весь виджет root в подпапку примера sr c и импортировать его оттуда вместо NPM, и он снова заработает.
Буду признателен за любую помощь или идеи. Я могу поместить весь свой код в Git, если кто-то заинтересован в более глубоком рассмотрении.