Модульный JavaScript — есть ли какие-либо подходы, кроме CommonJS и AMD, которые следует учитывать?

В настоящее время я готовлю оценку подходов модульности JavaScript для моей корпорации. Мы находимся в процессе определения «JavaScript Best Practices» для наших проектов, модульность — один из центральных вопросов.

Из моего исследования на данный момент выявлено два ведущих подхода:

С огромным количеством загрузчиков, плагинов, библиотек и т.д. вокруг них.

Кроме того, есть также goog.provide/goog.require из Библиотека закрытия Google.

Есть ли дополнительные подходы для рассмотрения? Какие-либо важные/соответствующие спецификации, которые я пропустил?

Наши требования, кратко:

  • Структурируйте код JavaScript в отдельных файлах.
  • Загрузите соответствующие модули во время выполнения.
  • ... без необходимости включать каждый файл в качестве тега скрипта.
  • Не должно быть необходимым для поддержки индекса файлов JavaScript.
  • Поддержка агрегации и минимизации — возможность создавать и использовать один минимизированный/оптимизированный файл JavaScript.
  • Уметь использовать модули в разных комбинациях — часто бывают разные веб-страницы/клиенты, которым нужны разные наборы модулей.
  • Сопроводительная документация (с JSDoc?).
  • Подходит для тестирования.
  • Подходит для Интернета, кроссбраузерный.
  • Разумная поддержка IDE.

Потенциально:

  • Согласовано с модулями ES6.
  • Подходит для Node.js и мобильных платформ (например, PhoneGap/Cordova).

Новые предложения из ответов:

  • ecmascript-harmony плюс дополнительный компилятор.
  • angularjs (см. примечание ниже).
  • extjs (см. примечание ниже).

Боковые примечания:

  • Вопрос не в том, какой подход лучше.
  • Я не прошу конкретных библиотек и инструментов, а скорее подходов и спецификаций.
  • Я специально не прошу сторонний ресурс. (Если для этого нет тега SO, нам, вероятно, нецелесообразно его рассматривать.)
  • Примечание о таких платформах, как angualjs или extjs. Это не совсем подходит в рамках этого вопроса. Если проекту нужен фреймворк (будь то AngularJS или ExtJS), то вопрос модульности обычно не возникает, поскольку фреймворк должен обеспечивать модульность OOTB. Если проекту не нужен фреймворк, брать фреймворк будет излишним из-за модульности. Это одна из причин, по которой я специально не спрашиваю о библиотеках/инструментах.

comment
@closer Я конкретно не спрашиваю мнения.   -  person lexicore    schedule 17.11.2014
comment
Этот вопрос принадлежит Programmers.Stackexchange   -  person Yang    schedule 21.11.2014
comment
См. medium.com/@trek/. Кроме того, я не совсем понимаю, почему вы указали соответствие модулям ES6 в качестве потенциального требования, когда оно само по себе является решением в тандеме с транспилером ES6, таким как Traceur.   -  person    schedule 22.11.2014
comment
Зачем тебе еще один шаблон...? Просто придерживайтесь того, что работает.   -  person Ryan    schedule 22.11.2014
comment
Рассматривали ли вы возможность, что ничегонеделание удовлетворяет всем вашим требованиям?   -  person    schedule 22.11.2014
comment
@torazaburo По крайней мере, мы должны структурировать код JavaScript в отдельных файлах, поэтому я не понимаю, как ничего не может удовлетворить это.   -  person lexicore    schedule 22.11.2014
comment
@torazaburo Вы правы насчет модулей ES6. Это вариант для рассмотрения.   -  person lexicore    schedule 22.11.2014
comment
@self Я не изобретаю еще один шаблон, я хочу оценить существующие шаблоны. Для этого я должен знать, какие шаблоны существуют. Мои личные знания ограничены, поэтому прошу спрашивать у сообщества.   -  person lexicore    schedule 22.11.2014
comment
Вы наверное спрашивали, что кроме синхронизации или асинхронной загрузки модуля учитывать?. Хорошо, я думаю, вы, вероятно, ищете проблему с javascript, а не с node.js. Какова основная цель загрузки модуля javascript? Не блокируйте пользовательский ввод/вывод. Итак, давайте поищем в Google запрос загрузка асинхронного модуля JavaScript. Вау! Посмотрите на это - addyosmani.com/writing-modular-js   -  person Pinal    schedule 26.11.2014
comment
@Pinal Ссылка очень полезна, она уже была опубликована в ответах. Моим основным требованием является не асинхронность, мое основное требование — организация кода.   -  person lexicore    schedule 26.11.2014
comment
Организация кода @lexicore не подразумевает, какую библиотеку использовать или нет. Организация кода заключается в том, как использовать ту или иную библиотеку. Выберите lib и используйте ее наилучшей практикой.   -  person Pinal    schedule 26.11.2014
comment
@Pinal Как вы могли заметить или не заметить, я специально не спрашиваю о библиотеках, я собираю подходы для оценки. Может быть, у вас есть еще один подход к модуляризации, который я мог бы рассмотреть?   -  person lexicore    schedule 26.11.2014


Ответы (7)


Как насчет ES Harmony?

цитата отсюда: http://addyosmani.com/writing-modular-js/

Примечание. Хотя Harmony все еще находится на стадии предложения, вы уже можете опробовать (частичные) функции ES.next, которые касаются встроенной поддержки написания модульного JavaScript благодаря Traceur компилятор. Чтобы приступить к работе с Traceur менее чем за минуту, прочтите это руководство по началу работы. Об этом также есть презентация JSConf, которую стоит посмотреть, если вы хотите узнать больше о проекте.

надеюсь, что поможет

person GavinBrelstaff    schedule 25.11.2014
comment
Хорошая ссылка, спасибо. ES Harmony стоит рассмотреть. Недостатком является дополнительный шаг сборки, который может быть излишним для проектов с небольшим количеством JS-файлов и небольшой аудиторией (у нас есть проекты >1Mio, которые используют ‹10 человек). - person lexicore; 26.11.2014
comment
Из моего PoV это лучший ответ. Вы предложили подход, который не был рассмотрен в вопросе. - person lexicore; 28.11.2014

Другой вариант: система модулей AngularJS, как описано здесь. Однако на самом деле это полезно только на стороне клиента.

person jasonhansel    schedule 22.11.2014
comment
См. этот комментарий в рамках. (В ответ на предложение ExtJS, но относится и к AngularJS.) - person lexicore; 26.11.2014

Вы написали: «Я прошу не конкретные библиотеки и инструменты, а скорее подходы и спецификации». однако вы можете ближе познакомиться со средой ExtJS 5, которая отвечает всем вашим требованиям.

Если вам не интересен такой коммерческий продукт, вы можете просто ознакомиться с паттернами и решениями в нем.

Отношение к вашим требованиям:

Структурируйте код JavaScript в отдельных файлах.

Он реализует парадигму объектно-ориентированного программирования, поэтому вы можете создавать классы, подклассы, объекты, миксины, плагины. Он соединяет программирование на основе классов и программирование на основе прототипов.

Стоит отметить архитектуру MVVM (View, Controller, ViewModel), привязку данных, сеанс данных (управление записями/сущностями на стороне клиента).

Система конфигов тоже довольно интересная. Это очень удобно. Свойство config объединяется из родительского класса с подклассами, а также во время создания объекта вы можете передать конфигурацию, которая также будет объединена. Это очень полезно, когда мы хотим иметь настраиваемые и гибкие компоненты.

Загрузите соответствующие модули во время выполнения.

Каждый класс может иметь директиву requires или uses, которые используются при сборке приложения в один файл. Вы также можете загружать файлы вручную.

... без необходимости включать каждый файл в качестве тега скрипта.

В dev файлы env загружаются динамически (асинхронно или синхронно).

В prod env необходимые файлы собраны в один минифицированный файл.

Поддержка агрегации и минимизации — возможность создавать и использовать один минимизированный/оптимизированный файл JavaScript.

Вы можете создать приложение с помощью инструмента Sencha cmd (и сделать несколько других вещей).

Вы можете использовать три предопределенных среды (разработка, тестирование, производство) или создать свою собственную (на основе файлов конфигурации и ant).

Уметь использовать модули в разных комбинациях — часто бывают разные веб-страницы/клиенты, которым нужны разные наборы модулей.

Вы можете использовать рабочие области и пакеты.

Сопроводительная документация (с JSDoc?).

JS Duck, учебник

Подходит для тестирования.

Вы можете выполнять модульные тесты (PhantomJS, JSLint, PhantomLint, Jasmine).

Вы можете использовать специализированную платформу, такую ​​как Siesta, или другие популярные среды тестирования, такие как Selenium.

Подходит для Интернета, кроссбраузерный.

С официального сайта:

Создавайте приложения для самых разных браузеров и операционных систем с помощью единой кодовой базы. Ext JS 5 использует функции HTML5 в современных браузерах, сохраняя при этом совместимость и функциональность для устаревших браузеров. Надежно доставляйте приложения своим конечным пользователям независимо от того, какой браузер они используют.

Поддержка: Safari 6+, Firefox, IE 8+, Chrome, Opera 12+, Safari/iOS, Safari/iOS 6+, Chrome/Android, Chrome/Android 4.1+, IE 10+/Win 8

Поддерживает приложение Cordova и PhoneGap.

Разумная поддержка IDE.

Я не знаю очень хорошей IDE с выделенной поддержкой ExtJS, но я работаю над Webstorm, и это нормально. Исходники библиотеки находятся внутри проекта, поэтому автодополнение работает (но не на 100% идеально).

Заключение

Я не хочу прославлять ExtJS 5. Среда достаточно зрелая и стабильная, но в последней версии фреймворка (v5) есть пара ошибок, и не все так хорошо. Однако я мог бы пойти глубже и познакомиться с принципами этой структуры, которые разумны, движутся в правильном направлении, но иногда плохо реализованы;)

person rzymek    schedule 22.11.2014
comment
Спасибо за развернутый ответ. Боюсь, ExtJS будет слишком большим, чтобы рассматривать его в рамках вопроса модульности. Это полноценный фреймворк. Какой фреймворк? другой вопрос. Если проекту нужен фреймворк (будь то AngularJS или ExtJS), тогда вопрос модульности не возникает, поскольку фреймворк обеспечивает модульность OOTB. Если проекту не нужен фреймворк, брать фреймворк будет излишним из-за модульности. - person lexicore; 26.11.2014
comment
@lexicore Я согласен, однако, если вы знаете какой-то фреймворк, то нет никакой разницы, насколько велико ваше приложение. Большинство фреймворков можно использовать в малых и больших проектах. Ваши требования довольно сложны и могут быть покрыты только многими инструментами или одним хорошим фреймворком;) - person rzymek; 26.11.2014

RequireJS — хороший подход, поскольку он обеспечивает динамическую загрузку модулей javascript, а также поддерживает чистоту кода. Вы также можете минимизировать целые модули, и это на самом деле работает очень быстро. Это также позволяет что-то, называемое shimming, где вы можете указать зависимости для библиотеки или любого файла js, чтобы всякий раз, когда вы пытаетесь загрузить его, все зависимости также следовали

person Arun    schedule 26.11.2014
comment
Спасибо. RequireJS — это amd, поэтому он рассматривается в вопросе. - person lexicore; 26.11.2014

Взгляните на systemJS:

Универсальный загрузчик модулей, соответствующий спецификации — загружает модули ES6, AMD, CommonJS и глобальные скрипты.

Разработан как набор небольших расширений системного загрузчика спецификации ES6, которые также можно применять по отдельности.

Загружает любой формат модуля, определяя формат автоматически. Модули также могут указывать свой формат с помощью метаконфигурации. Обеспечивает всестороннюю и точную репликацию обработки циклических ссылок AMD, CommonJS и ES6. Загружает модули ES6, скомпилированные в форму System.register для производства, поддерживая полную поддержку циклических ссылок. Поддерживает карты, пути, пакеты, прокладки и плагины в стиле RequireJS. Отслеживает версии пакетов и разрешает semver-совместимые запросы с помощью синтаксиса версии пакета — [email protected], package^@x.y.z. Плагины загрузчика позволяют загружать активы через систему именования модулей, такую ​​как CSS, JSON или изображения. Разработан для работы с полифиллом загрузчика модулей ES6 (9 КБ) для общего размера 16 КБ в минимизированном и сжатом виде. В будущем, с нативными реализациями, полифилл загрузчика модулей ES6 больше не понадобится. Поскольку jQuery обеспечивает DOM, эта библиотека может сгладить несоответствия и отсутствующие практические функции, предоставляемые собственным системным загрузчиком.

Работает в IE8+ и NodeJS.

Создатель библиотеки — Гай Бедфорд — также является отличным докладчиком: презентация systemJS.

person artur grzesiak    schedule 26.11.2014
comment
@lexicore Он отличается от обычных современных браузеров. Взгляните на презентацию Бедфорда — она просто потрясающая. - person artur grzesiak; 26.11.2014
comment
Спасибо за разъяснения. Это должно быть исправлено на странице, я зарегистрирую проблему. Это явное заблуждение... - person lexicore; 26.11.2014

Взгляните на обзор. Он реализует интересный подход. С помощью browserify вы можете писать код, который использует require так же, как вы использовали бы его в Node.

person Stanislav Ostapenko    schedule 22.11.2014
comment
Browserify — это в основном CJS плюс AMD через deamdify, поэтому вопрос уже рассмотрен. Хотя Browserify — это хорошо. - person lexicore; 26.11.2014

Существуют различные библиотеки для модульной разработки, некоторые из которых полностью соответствуют вашим критериям.

  • System.js System.js — это модульная библиотека разработки с некоторыми базовыми функциями для работы с IE8+ и nodejs. Он также предоставляет возможность разработки модулей, и вы можете включить его в свой основной файл. Для получения дополнительной информации о System.js перейдите по ссылке https://github.com/systemjs/systemjs.
  • Require.js Лучшая библиотека для модульной разработки. Предоставляет различные полезные функции и поддерживает старые браузеры. Он поддерживает от IE 6+. Еще одна полезная функция require.js заключается в том, что его можно использовать с Rhinojs и nodejs. Реализация проста, как если бы вы включали модули в nodejs.
person Laxmikant Dange    schedule 27.11.2014