Лучшие практики ILMerge

Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.

Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.

Рассмотрим следующую разметку; сценарий # 1 не находит

, а сценарий # 2 преуспевает:


test div

Итак, что вы должны делать? У вас есть несколько вариантов:


Вариант 1: Переместите свой скрипт

Переместите свой скрипт дальше по странице, перед закрывающим тегом тела. Организованный таким образом остальная часть документа анализируется до того, как будет выполнен ваш скрипт:


  
  

Примечание: размещение скриптов внизу как правило, считается лучшей практикой .


Вариант 2: jQuery's ready()

Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя ready() :



Примечание. Вы можете просто привязать к DOMContentLoaded или window.onload, но у каждого есть свои оговорки. jQuery ready() предоставляет гибридное решение.


Вариант 3: Делегирование событий

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

blockquote>

Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код.

jQuery on() выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:



Примечание: Обычно этот шаблон зарезервированы для элементов, которые не существовали во время загрузки или , чтобы избежать прикрепления большого количества обработчиков. Также стоит отметить, что, пока я прикреплял обработчик к document (для демонстрационных целей), вы должны выбрать ближайшего надежного предка.


Вариант 4: Атрибут defer

Используйте атрибут defer в

Для справки, вот код из этого внешнего скрипта :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

Примечание: атрибут defer, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10

71
задан ckittel 15 August 2011 в 18:27
поделиться

7 ответов

Я использую ILMerge почти для всех моих различных приложений. У меня есть интегрированный прямо в процесс сборки конечных версий поэтому, с чем я заканчиваю, один exe на приложение без дополнительного dll's.

Вы не можете ILMerge никакие блоки C++, которые имеют собственный код. Вы также не можете ILMerge никакие блоки, которые содержат XAML для WPF (по крайней мере, я не имел никакого успеха с этим). Это жалуется во времени выполнения, что ресурсы не могут быть расположены.

я действительно писал исполняемый файл обертки для ILMerge, куда я передаю в запуске exe название проекта, я хочу объединиться, и вывод exe имя, и затем это отражает зависимые сборки и называет ILMerge с соответствующими параметрами командной строки. Намного легче теперь, когда я добавляю новые блоки к проекту, я не должен помнить обновлять сценарий сборки.

42
ответ дан Dinah 24 November 2019 в 13:05
поделиться

Мы используем ILMerge на блоках приложений Microsoft - вместо 12 отдельных файлов DLL, у нас есть единственный файл, который мы можем загрузить на наши клиентские области, плюс структура файловой системы намного более опрятно.

После слияния файлов, я должен был отредактировать список проекта Visual Studio, удалить 12 отдельных assmeblies и добавить единственный файл как ссылку, иначе это будет жаловаться, что не могло найти определенный блок. Я не слишком уверен, как это работало бы над развертыванием сообщения, хотя, могло стоить дать ему попытку.

10
ответ дан Surgical Coder 24 November 2019 в 13:05
поделиться

Мы используем ILMerge на довольно многих проектах. Фабрика Web Service Software , например, производит что-то как 8 блоков как ее вывод. Мы объединяем все те DLLs в единственный DLL так, чтобы сервисный хост должен был только сослаться на один DLL.

Это делает жизнь несколько легче, но это не имеет большого значения также.

3
ответ дан Esteban Araya 24 November 2019 в 13:05
поделиться

Мы только что начали использовать ILMerge в наших решениях, которые перераспределяются и используются в наших других проектах и пока неплохо. Все, кажется, работает хорошо. Мы даже запутали упакованный блок непосредственно.

Мы рассматриваем выполнение того же с блоками Библиотеки MS Enterprise.

единственная реальная проблема я вижу с ним, управление версиями отдельных блоков от пакета.

0
ответ дан markom 24 November 2019 в 13:05
поделиться

Мы столкнулись с проблемами при объединении библиотек DLL, ресурсы которых находятся в одном пространстве имен. В процессе слияния одно из пространств имен ресурсов было переименовано, и поэтому ресурсы не удалось найти. Может, мы просто что-то делаем не так, но все еще изучаем проблему.

1
ответ дан 24 November 2019 в 13:05
поделиться

У меня недавно возникла проблема, когда я включил сборку в сборку. У меня были некоторые классы, которые вызывались через отражение в CMS с открытым исходным кодом Umbraco.

Информация для вызова через отражение была взята из таблицы db, которая имела имя сборки и пространство имен реализованного класса и интерфейса. Проблема заключалась в том, что вызов отражения завершался ошибкой при слиянии dll, однако, если dll была отдельной, все работало нормально. Я думаю, проблема может быть похожа на ту, что у longeasy?

0
ответ дан 24 November 2019 в 13:05
поделиться

Мне кажется, что лучший метод №1 для ILMerge - не использовать ILMerge. Вместо этого используйте SmartAssembly . Одна из причин этого заключается в том, что лучший метод №2 ILMerge - всегда запускать PEVerify после выполнения ILMerge, потому что ILMerge не гарантирует, что он правильно объединит сборки в допустимый исполняемый файл.

Другие недостатки ILMerge:

  • при слиянии он удаляет комментарии XML (если бы я заботился об этом, я бы использовал инструмент обфускации)
  • он неправильно обрабатывает создание соответствующего файла .pdb

Другой Стоит обратить внимание на инструменты Mono.Cecil и Mono.Linker [2].

[2]: http: // www.mono-project.com/Linker

-1
ответ дан 24 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: