2017-02-15 18 views
4

Я использую последнюю стабильную версию Material UI в своем приложении React для производства.Используйте компоненты из двух версий одной и той же библиотеки (npm/Material UI в моем случае)

Мне нужен обновленный компонент таблиц данных, который в настоящее время находится в нестабильной альфа-ветви Material UI.

Я не хочу обновлять все мое приложение с помощью npm i [email protected] из-за многочисленных нарушений.

Как я могу получить доступ к альфа-библиотеке без обновления всей моей библиотеки? Могу ли я установить две версии MUI? Могу ли я вызвать альфа-API без его установки через NPM?

Заранее спасибо.

+1

Установка нескольких версий пакета в параллельном режиме с использованием 'npm' не представляется возможным. Лучшим обходным решением, которое я видел, является создание пакета «shim» (ex 'material-ui-next', который зависит от' material-ui @ next') и зависит от того, что в вашем проекте. – Aaron

+0

спасибо @Aaron - Я знаком с прокладками в реестре npm, должен ли я создать новый, переименованный пакет npm, или я могу сделать это локально? – Doa

+1

Да, вы можете установить '' локальный модуль файловой системы '' (https://docs.npmjs.com/cli/install), используя 'npm install./Path/to/material-ui-next', или вы можете [использовать 'npm link'] (https://docs.npmjs.com/cli/link). – Aaron

ответ

2

Я создал в /packages папку с именем material-ui-next с только package.json внутри него, который содержит:

{ 
    "name": "material-ui-next", 
    "version": "1.0.0", 
    "scripts": { 
    "postinstall": "mv node_modules/material-ui/* ." 
    }, 
    "dependencies": { 
    "material-ui": "next" 
    } 
} 

Так что теперь от корня проекта можно сделать npm install packages/material-ui-next --save то можно createPalette = require('material-ui-next/styles/palette') или что-то один хочет требовать от material-ui сейчас aliased как material-ui-next.

Пояснения: а "material-ui": "next" является зависимость он будет установлен в node_modules/material-ui так, добавив скрипт после пакета material-ui-next устанавливается для перемещения node_modules/material-ui в корень пакета мы можем require('material-ui-next/WHATEVER')

+1

не переместит ли исходная папка 'node_modules/material-ui /'? – Kuf

+0

Я не уверен, чтобы понять ваш вопрос, но если вам интересно, могут ли сценарии postinstall перемещать модуль вашего реального проекта, это не так, потому что корневая папка скрипта будет фактически% YOURPROJECTROOT%/node_modules/material -ui-next, и эта папка содержит еще один node_modules с материалом-ui, содержимое которого перемещается скриптом в начало материала папки-ui-next. Отвечает ли это на ваш вопрос? –

9

Через некоторое Googling, найденного this , Для того, чтобы использовать обе версии:

yarn add [email protected] 
yarn add [email protected]:[email protected] 

Затем вы можете использовать

import Divider from 'material-ui-next/Divider' 

или

import Divider from 'material-ui/Divider' 
+1

Я успешно добавил две версии библиотеки с помощью Yarn, но после компиляции я получаю: TypeError: Не могу прочитать свойство «readyStyles» неопределенного. – Jumpa

+0

@Jumpa такой же здесь. Я думаю, что это связано с тем, как MuiThemeProvider используется в двух разных версиях. Я пытаюсь решить это в настоящее время - сообщите мне, если вы найдете решение. – BarthesSimpson

+0

есть предостережение для этого решения: каждый раз, когда я делаю «обновление пряжи», пряжа преобразует обе версии материала-ui в package.json в «следующую» версию. Затем мне нужно вручную исправить до 0.20.0, удалить node_modules и yarn.lock, а затем снова запустить пряжу – Alex