Comments 35
Типизированные массивы.
P.S. Поддерживаю такую реализацию модулей. Она позволяет имплементировать приватность, что тяжело при помощи других методов.
Спасибо за труды при написанни статьи, коротко и по сути.
В JS сейчас такое безумие творится, что подобная статья смотрится уже устаревшей. Ну и пункт 3 какой-то стремный в сегодняшних реалиях. Gulp многие пытаются на свалку отправить, не говоря уже про Grunt.
Бекендщикам сейчас конечно сложновато погружаться в JS — много времени потребуется на всю эту «хипстоту» :)
Я тоже был удивлён, когда не нашёл подобных статей. Но когда я стартанул с JS, мне очень не хватало такого.
window[config.globalName] = yourApiVar;
Это на самом деле классика. Во многих библиотечках используется. И хипстерских, и супер-оптимизированных. Необходимость.
И что вместо Gulp и Grunt? Прочитал сейчас пару статей, интересно. Рекомендуют чистый npm и прочее.
«Накладные расходы» на поддержку нормальной модульности минимальны, призывы «только конкатенация» непонятны.
Рекомендуют книжку https://www.manning.com/books/third-party-javascript
Было бы интересно почитать по сокетам. По ним довольно много материала. Но так, чтобы коротко и по делу я не видел. Может плохо искал, каюсь.
— код в странице открытой с сайта
— во фрейме
— на странице, открытой локально с диска
— в расширении (popup, background, content) — для хрома(оперы), файрфокса (да, движок хромиум, но обвес там совсем другой),
— далее вебворкеры
— да, для firefox-а — bootstrap.js в интересном контексте запускается, там не все модули доступны, я например до сторейджа (simple-storage) так и не смог достучаться
— pac-файлы тоже, хоть и стандарт есть — везде в разном контексте запускаются (в хроме это не совсем песочница, по крайней мере регексы доступны, хотя по стандарту не должны, а в лисе даже описанные в стандарте функции недоступны)
Так, навскидку вроде все распространенное охватил на клиенте. В общем если займетесь — могу даже подсобить.
Про контексты в расширениях — это довольно значимый пунктик, в частности, доступ к chrome API из injected-скриптов, доступ к js-окружению на странице, контекст применения HMR-обновлений (т.к. это не обычная страница, пришлось немного подпилить механизм hot-апдейтов) и т.д. нюансы.
Если будут желающие поучаствовать словом и делом — буду рад.
На самом деле всё началось именно с chrome extension, а потом функциональность перекочевала в injected script, потом во встраиваемый скрипт.
"доступ к chrome API из injected-скриптов" — я в расширении реализовал специальный channel — он заворачивает функции и шлёт события и на другой стороне вызывает реализацию этих фунций. Вы сделали похоже?
Буду иметь ввиду. Напишите, по крайней мере интересно посмотреть: dmitry@kuoll.com
Да, хороший вопрос, вполне достойный отдельной статьи.
sharedState = {};
Вы действительно хотите сделать эти 2 переменные видимыми снаружи?
Почему не сделать этого явно?
Откуда берется функция start, которую вы вызываете?
config и sharedState не видны снаружи, они же ведь объявлены внутри функции.
Функция start() — из пункта 5; её задача — явная инициализация всего API.
Вы ошибаетесь.
(function(){
config={test:'test'};
})();
console.log(config);
https://github.com/umdjs/umd
Ответ очевиден: когда вы сконкатенируете код таких модулей, всё будет работать безо всяких библиотечек для модулей.
Серьезно?
Если есть возражения, мы готовы их услышать.
Окей, я даже немного растерялся. Webpack, Browserify, Systemjs, Reflow (пусть меня поправят, если я что-то упустил) не требуют никаких "библиотечек для модулей". Только бандл проекта, использующего RequireJS требует библиотеку, имплементирующую AMD, например Almond (это всего 1К оверхеда), и то, даже с этим древним бандлером можно воспользоваться не менее древним AMD Clean. Ваши знания явно немного устарели.
Паттерн «модуль» и паттерн «открытия модуля» однозначно стоит применять. Но на мой взгляд нужно возвращать не инстанс модуля, а конструктор модуля. Это позволит из внешнего кода создать инстанс модуля самостоятельно и пробросить в функцию конструктор модуля нужные параметры или зависимости. Сконфигурировать модуль под место его работы.
Таким образом можно использовать несколько экземпляров одного модуля на странице и каждый настроить на свой вкус.
Разработка JavaScript API: 5 принципов написания встраиваемых скриптов