2017-02-10 4 views
16

Я пытаюсь импортировать материал-интерфейс в моем React приложение с использованием System.JSКак мне отобразить ./[module] в /[module]/[module].js в System.JS?

В моем приложении, я делаю это:

import {AppBar, Tabs, Tab, Card, CardTitle} from 'material-ui'; 

Вот мой System.JS конфигурации:

System.config({ 
    baseURL: '/node_modules', 
    packageConfigPaths: [ 
     '*/package.json' 
    ], 
    packages: { 
     '.': { 
      defaultExtension: 'js', 
      main: 'index.js' 
     }, 
    } 
}); 

Он загружает node_modules/material-ui/index.js, который имеет кучу импорта внутри него:

var _AppBar2 = require('./AppBar'); 

var _AppBar3 = _interopRequireDefault(_AppBar2); 

var _AutoComplete2 = require('./AutoComplete'); 

var _AutoComplete3 = _interopRequireDefault(_AutoComplete2); 

// ... etc, about 40 of them. 

exports.AppBar = _AppBar3.default; 
exports.AutoComplete = _AutoComplete3.default; 

// ... etc 

В древовидной структуре пакета, каждый из этих модулей хранится в своем собственном каталоге, как это:

material-ui/ 
    index.js 
    AppBar/ 
    AppBar.js 
    index.js -- just reexports './AppBar' 
    AutoComplete/ 
    AutoComplete.js 
    index.js -- just reexports './AutoComplete' 

и т.д., так что на самом деле импортировать material-ui/AppBar, мне нужно, чтобы загрузить System.JS node_modules/material-ui/AppBar/AppBar.js или node_modules/material-ui/AppBar/index.js.

Вместо этого System.JS пытается загрузить node_modules/material-ui/AppBar.js, которого нет.

Если добавить отдельные записи для каждого модуля под packages:

'material-ui': { 
    map: { 
     './AppBar': './AppBar/AppBar.js' 
    } 
} 

это работает, однако символы:

'material-ui': { 
    map: { 
     './*': './*/*.js' 
    } 
} 

нет.

Как сделать карту System.JS ./* по ./*/*.js под определенным пакетом?


В качестве примечания, browserify не имеет никаких проблем с этим макетом, поэтому, когда я связать мое приложение с помощью browserify просто позвонив по телефону browserify('./path/to/root/index.js'), все материально-щий модули импортируются без каких-либо проблем.

+0

Настоящая проблема заключается в том, что SystemJS не поддерживает разрешение узла. Я думаю, что они планируют добавить его, но теперь такие вещи, как Browserify и Webpack, могут делать такие вещи из коробки. Есть ли причина, по которой вам нужно использовать SystemJS? – Menello

+0

@Menello: вообще нет причины, кроме того, что я только знаком с способностью Browserify делать пакеты (так я фактически использую его в своей системе) и вообще не знаком с Webpack. Я находился под впечатлением, что SystemJS может анализировать 'package.json' в модулях. То, что мне нужно, - это использовать отдельные пакеты из 'node_modules' и исходного дерева без необходимости связывать их в течение цикла разработки, чтобы я мог взломать пакет в' node_modules' на месте, обновить и мгновенно увидеть, что происходит, не связывая все это. Я не буду использовать System.JS в производстве. – Quassnoi

+0

Если вы обслуживаете папку с узлами модулей, вы можете просто добавить к ней тег сценария: ''? Достаточно ли этого? – Menello

ответ

4

Подстановочные знаки не являются supported в System.js. Вам придется вручную добавить запись для каждого модуля:

'material-ui': { 
    map: { 
    './AppBar': './AppBar/AppBar.js', 
    './AppHeader': './AppHeader/AppHeader.js', 
    './AppFooter': './AppFooter/AppFooter.js', 
    //etc 
    } 
} 

Вы также можете использовать jspm генерировать этот список для вас.

+1

Обратите внимание, что комментарий, на который вы ссылаетесь, говорит о настройке 'paths', а не настройке' map'. – Louis

+0

ah thanks - исправит – hackerrdave

+0

@hackerrdave: спасибо. Является ли 'jspm' инструментом для создания конфигураций System.JS? (похоже, да, это просто не очевидно из документации для меня). Учитывая, что у меня есть файл 'index.js', который рекурсивно загружает кучу модулей и который я могу преобразовать в пакет, запустив его с помощью« браузера »с нулевой конфигурацией, как упоминалось в OP, как я буду использовать' jspm' для создать конфигурацию? – Quassnoi

Смежные вопросы