2016-02-04 11 views
2

У нас есть кросс-платформенное приложение на основе Polymer и Chromium.Переход с ES5 на ES2015 с пространством имен

В настоящее время все наши JavaScript-константы поддерживаются в index.html, импортируйте их в нажав влево заказать! Этот подход скоро станет кошмаром, и писать тест и увидеть тестовое покрытие - непростая задача.

Для будущего спасения мы решили перейти на ES2015 с его модульным подходом.

Теперь нам нужно переконфигурировать наши файлы JavaScript, чтобы иметь возможность поддерживать зависимости между отдельными модулями JavaScript. Все идет нормально. Но как мы это делаем, чтобы сохранить наши пространства имен, закрытие и т. Д.?

Это пример кода:

//namespace check 
var app_ns = app_ns || { }; 

// **************************************************************************** 
// Module: app 
// **************************************************************************** 

app_ns.app = (function initialize() { 

    // *** 
    // basic APIs and definitions 
    // *** 

    // Application version will be replaced by Gruntfile task. 
    // Don't change the version manually!!! 
    var AW_VERSION = "1.4.32"; 

    function version() { return AW_VERSION; } 
    ... 

    // *** 
    // exports 
    // *** 
    return { 
    version : version 
    }; 
}()); 

Как видно из приведенного выше инициализации кода выполняется и назначен app_ns.app. Из-за простоты фрагмент кода не отображает зависимости с другими модулями, но мы точно знаем это!

Так вопросы

  • Как использовать пространство имен в ES2015
  • Как автоматически выполнять закрытие
  • Как экспортировать функции модулей, но не в глобальном масштабе!

export { xxx }; экспортирует все функции внутри {...} в глобальном масштабе, не так ли? Как привязать экспортированные функции к правильному пространства имен? В этом примере до app_ns.app

+0

просто экспортируйте существующие объекты, например 'app_ns.app', после того как они определены. – dandavis

+1

Вы хотите, чтобы это пространство имен было внешним API? Как только вы правильно экспортируете вещи и импортируете их в другое место, я бы не ожидал, что какое-либо использование объектов пространства имен внутри вашего собственного кода. – loganfsmyth

+0

Вы не использовали бы пространства имен в ES6, кроме API вашей библиотеки. – Bergi

ответ

0

«Использование экспорта {xxx}; экспортирует все функции внутри {...} в глобальном масштабе, не так ли?" Не совсем верно. Он экспортирует его в область, которая импортирует его. В настоящее время браузеры не имеют возможности обрабатывать модули изначально, поэтому большинство коммутаторов преобразуют стандарт CommonJs и расширяют его, чтобы он не был глобальным. Я бы пересмотрел, если в парадигме модуля необходимо пространство имен.