#angularjs #iife
#angularjs #iife
Вопрос:
У меня есть приложение, созданное с помощью AngularJS, все приложение состоит из IIFEs (выражение функции, вызываемое немедленно). Каждый модуль, директива, контроллер сам по себе является IIFE, и их насчитывается около 100.
Я хочу знать, в чем заключается подводный камень производительности, когда в приложении так много IIFEs.
Нормально ли использовать IIFEs с AngularJS?
Насколько хорошо использовать библиотеки, такие как browserify и requirejs, с AngularJS для управления зависимостями?
Не могли бы вы, пожалуйста, пролить немного света на это?
Ответ №1:
Вопрос, который вам нужно задать в первую очередь, заключается в том, есть ли у вас какие-то внутренние части в IIFE, которые вы не хотите предоставлять глобальной области видимости.
Весь смысл создания замыкания таким образом заключается в том, чтобы имитировать инкапсуляцию и избежать загрязнения глобальной области видимости.
Проблему производительности не так-то просто измерить; я думаю, что проблема с производительностью незначительна при создании IIFE (не забывайте, что вы просто создаете функцию). Одна из проблем производительности, о которой я мог бы подумать, заключается в том, что когда вы ссылаетесь на функциональную переменную из внутренней функции, вам нужно пройти по цепочке областей видимости и получить ее из объекта closure.
Я бы порекомендовал вам взглянуть на такие шаблоны, как шаблон модуля, раскрывающий шаблон модуля и т.д. Я лично использую шаблон revealing module.
Browserify и RequireJS — это две библиотеки, которые реализуют две разные спецификации; CommonJS и AMD соответственно. Эти две спецификации пытаются приспособить функциональность, которая не поддерживается ES3 или ES5; Это способ определения модулей и последующей загрузки их в указанные местоположения.
Если вы хотите определять модули и загружать их синхронно аналогично тому, как работает hose NodeJS, вы можете использовать Browserify. Кроме того, Browserify позволяет вам использовать одни и те же модули как на стороне клиента, так и на стороне сервера (при условии, что вы используете NodeJS).
С другой стороны, если вы хотите асинхронно загружать свои модули, вы можете использовать AMD и RequireJS, но вы не сможете повторно использовать их на серверной части.
Наконец, имейте в виду, что все, что вы упомянули, напрямую не связано с AngularJS; это несколько хороших методов JavaScript для преодоления некоторых проблем самого языка. Его можно хорошо использовать независимо от того, работаете вы с angular или нет.
Я бы рекомендовал вам использовать либо browserify, либо RequireJS; это принесет вам пользу в долгосрочной перспективе. Просто представьте, что у вас есть 100 JS-файлов; вам нужно будет вручную перенести их в ваш html-код в правильном порядке на основе графика зависимостей. Вы можете легко столкнуться с такими проблемами, как условия гонки, когда один файл должен был быть вставлен раньше другого.
Что касается накладных расходов на производительность IIFEs, у вас не должно возникнуть никаких серьезных проблем.
Комментарии:
1. большое спасибо за ваши комментарии, я обнаружил, что requirejs является накладными расходами с angularjs, поскольку angularjs имеет собственный DI, requirejs подходит для библиотек, таких как backbonejs, которые не имеют понятия о том, какую функцию вызывать, когда. Для angularjs я нахожу browserify таким же хорошим.
Ответ №2:
Как сказано в другом ответе, IIFEs являются хорошей общей практикой, независимой от AngularJS.
Если вас беспокоит производительность IIFEs, ознакомьтесь с этими тестами производительности в JSPerf (или напишите свой собственный):
Хотя некоторые способы создания IIFE явно намного медленнее других, я бы не беспокоился о производительности IIFEs, если вы не находитесь в большом цикле.
Комментарии:
1. спасибо за ваши комментарии, я обнаружил только проблему с глобальным охватом при использовании IIFEs, в остальном все в порядке. Присоединение многих объектов к глобальной области видимости или создание слишком большого количества замыканий затрудняет работу GC. Согласно инструментам разработчика Chrome, чем дальше расстояние от GC root, тем лучше будет GC.
2. Это разумное утверждение о взаимосвязи между расстоянием от root и GC. У вас есть ссылка на это?