2017-02-23 6 views
3

Если у меня есть LIB, говорят utils.js, который выглядит как этотКак загрузить именованные экспорта с SystemJS

exports.foo = function() { 
    return 'foo'; 
}; 

exports.bar = function() { 
    return 'bar'; 
}; 

, который можно использовать следующим образом

import {foo} from './libs/utils'; 

console.log(foo()); 

не очень эффектно, но я получаю что эта проблема является источником проблемы, описанной в сообщении this. Во всяком случае, я не могу заставить это работать в сочетании с SystemJS. Я должен изменить код, чтобы исправить это

import utils from './libs/utils'; 

console.log(utils.foo()); 

Вот мой systemjs-конфигурационный файл:

SystemJS.config({ 
    map: { 
     'plugin-babel': 'node_modules/systemjs-plugin-babel/plugin-babel.js', 
     'systemjs-babel-build': 'node_modules/systemjs-plugin-babel/systemjs-babel-browser.js', 
    }, 
    packages: { 
     '.': { 
      defaultJSExtensions: 'js' 
     } 
    }, 
    transpiler: 'plugin-babel' 
}); 

Таким образом, кажется, только exports объект может быть загружен и не поименованный экспорт. Может ли это как-то быть исправлено?

UPDATE У меня складывается впечатление, что может быть исправлено с formats

meta: { 
    './libs/utils.js': { 
     format: 'cjs' 
    } 
} 

Но до сих пор он дает те же самые проблемы

ответ

3

Такое поведение не SystemJS специфичны. SystemJS ведет себя так же, как и версия 0.20, потому что это стандартизация совместимости модулей ES6.

Когда вы, как и в своем вопросе, импортируете модули CommonJS (экспортируемые через module.exports) с использованием ES6 import, вы получите весь экспорт, и вы не сможете сразу же разрушить экспортированные имена.

Однако, если вы используете import модули, которые экспортируются через ES6 export, вы сможете разрушить экспортируемые имена.

Итак, это все по дизайну. Guy Bedford писал об этом в своем блоге и ссылке стандартизации модуля, что происходит за NodeJS:

... именованный экспорт больше не будет разрешен при импорте модуля в CommonJS из модуля ES и обсуждается на https://github.com/nodejs/CTC/pull/60/files#diff-2b572743d67d8a47685ae4bcb9bec651R217.

То есть, import { name } from 'cjs.js', где cjs.js является модуль CommonJS больше не будет поддерживаться, и вместо этого потребуется import cjs from 'cjs.js'; cjs.name.

Interop обходной путь с помощью __esModule:

Мы будем продолжать поддерживать __esModule флаг в Interop, хотя, позволяя лифтинг именованных экспорта для этих случаев.

Так что, если cjs.js модуль был написан:

exports.__esModule = true; 
exports.name = function() { ... } 

тогда можно было бы иметь import { name } from 'cjs.js';, даже хотя cjs.js является модулем CommonJS, хотя это __esModule будет в конечном счете, в долгосрочной перспективе быть нежелателен Что ж.

+0

Это не разрушение, даже если сокращенный синтаксис не меняется. – Bergi