Эта проблема
На этот ответ уже был дан ответ, но он старый и не актуален. У меня более 2000 строк кода в одном файле, и, как мы все знаем, это плохая практика, особенно когда я просматриваю код или добавляю новые функции. Я хочу лучше организовать свой код сейчас и в будущем.
Я должен упомянуть, что я создаю инструмент (а не простой веб-сайт) с множеством кнопок, элементов пользовательского интерфейса, перетаскивания, перетаскивания, слушателей / обработчиков действий и функций в глобальной области, где несколько слушателей могут использовать одну и ту же функцию.
Пример кода
$('#button1').on('click', function(e){
// Determined action.
update_html();
});
... // Around 75 more of this
function update_html(){ .... }
...
Вывод
Мне действительно нужно организовать этот код для лучшего использования, чтобы не повторяться и иметь возможность добавлять новые функции и обновлять старые. Я буду работать над этим сам. Некоторые селекторы могут состоять из 100 строк кода, другие - 1. Я немного посмотрел require.js
и обнаружил, что это отчасти повторяется, и на самом деле я написал больше кода, чем нужно. Я открыт для любого возможного решения, которое соответствует этим критериям, и ссылка на ресурсы / примеры всегда является плюсом.
Спасибо.
Ответы:
Я рассмотрю несколько простых вещей, которые могут вам помочь, а могут и не помочь. Некоторые из них могут быть очевидными, некоторые - чрезвычайно загадочными.
Шаг 1. Разделите код
Разделение кода на несколько модульных блоков - очень хороший первый шаг. Соберите все, что работает «вместе», и поместите их в отдельный маленький корпус. пока не беспокойтесь о формате, оставьте его встроенным. Структура - более поздний момент.
Итак, предположим, у вас есть такая страница:
Было бы разумно разделить на части, чтобы все обработчики / связыватели событий, связанные с заголовками, были там, для простоты обслуживания (и не нужно просеивать 1000 строк).
Затем вы можете использовать такой инструмент, как Grunt, чтобы воссоздать свой JS в виде единого модуля.
Шаг 1а: Управление зависимостями
Используйте библиотеку, такую как RequireJS или CommonJS, для реализации чего-то, что называется AMD . Асинхронная загрузка модуля позволяет вам явно указать, от чего зависит ваш код, что затем позволяет вам переложить вызов библиотеки в код. Вы можете буквально сказать: «Для этого нужен jQuery», и AMD загрузит его и выполнит ваш код, когда jQuery будет доступен .
В этом также есть скрытая жемчужина: загрузка библиотеки будет произведена во второй раз, когда DOM будет готов, а не раньше. Это больше не останавливает загрузку вашей страницы!
Шаг 2: модульное построение
Видите каркас? У меня два рекламных блока. Скорее всего, у них будут общие слушатели событий.
Ваша задача на этом этапе - определить точки повторения в вашем коде и попытаться синтезировать все это в модули . Модули прямо сейчас охватят все. Мы будем разделять материал по мере продвижения.
Вся идея этого шага состоит в том, чтобы перейти от шага 1 и удалить все копии-пасты, чтобы заменить их модулями, которые слабо связаны. Итак, вместо того, чтобы иметь:
ad_unit1.js
ad_unit2.js
У меня будет:
ad_unit.js
:page.js
:Это позволяет вам разделить события и разметку, а также избавиться от повторов. Это довольно приличный шаг, и мы расширим его позже.
Шаг 3. Выберите фреймворк!
Если вы хотите еще больше разделить на модули и сократить количество повторений, существует множество замечательных фреймворков, реализующих подходы MVC (Модель - Представление - Контроллер). Мне больше всего нравится Backbone / Spine, но есть также Angular, Yii, ... Список можно продолжить.
Модель представляет данные.
View представляет свою наценку и все события , связанные с ним
Контроллер представляет бизнес - логику - другими словами, контроллер сообщает страницу , какие представления для нагрузки и какие модели использования.
Это будет важный этап обучения, но он того стоит: чистый модульный код предпочтительнее спагетти.
Есть много других вещей, которые вы можете сделать, это просто рекомендации и идеи.
Изменения, специфичные для кода
Вот некоторые конкретные улучшения вашего кода:
Лучше записать это так:
Ранее в вашем коде:
Внезапно у вас есть способ создать стандартный слой из любого места вашего кода без копирования и вставки. Вы делаете это в пяти разных местах. Я только что сохранил вам пять копировальных паст.
Еще один:
// Обертка набора правил для действий
Это очень эффективный способ регистрации правил, если у вас есть нестандартные события или события создания. Это также является серьезным ударом в сочетании с системой уведомлений pub / sub и когда привязано к событию, которое вы запускаете при создании элементов. Модульная привязка событий Fire'n'forget!
источник
View
. Так. Как это не относится к вашему коду?layers.js
,sidebar.js
,global_events.js
,resources.js
,files.js
,dialog.js
если вы только собираетесь разделить свой код на. Используйте,grunt
чтобыGoogle Closure Compiler
собрать их в один, а также скомпилировать и свернуть.Вот простой способ разделить текущую кодовую базу на несколько файлов с помощью require.js. Я покажу вам, как разбить код на два файла. После этого добавить больше файлов будет просто.
Шаг 1) В верхней части кода создайте объект приложения (или любое другое имя, которое вы предпочитаете, например MyGame):
var App = {}
Шаг 2) Преобразуйте все переменные и функции верхнего уровня в объект App.
Вместо того:
var selected_layer = "";
Вы хотите:
App.selected_layer = "";
Вместо того:
Вы хотите:
Обратите внимание, что на этом этапе ваш код не будет работать, пока вы не закончите следующий шаг.
Шаг 3) Преобразуйте все ссылки на глобальные переменные и функции, чтобы они проходили через приложение.
Измените такие вещи, как:
кому:
и:
кому:
Шаг 4) Протестируйте свой код на этом этапе - все должно работать. Возможно, сначала вы получите несколько ошибок, потому что что-то упустили, поэтому исправьте их, прежде чем двигаться дальше.
Шаг 5) Настройте requirejs. Я предполагаю, что у вас есть веб-страница, обслуживаемая веб-сервером, код которого находится в:
и jquery в
Если эти пути не совсем такие , как это, приведенное ниже не будет работать, и вам придется изменить пути.
Загрузите requirejs и поместите require.js в свой
www/js
каталог.в вашем
page.html
, удалите все теги сценария и вставьте тег сценария, например:создать
www/js/main.js
с содержанием:затем поместите весь код, который вы только что исправили на шагах 1-3 (единственная глобальная переменная которого должна быть App) в:
В самом верху этого файла поместите:
Внизу поставьте:
Затем загрузите page.html в свой браузер. Ваше приложение должно работать!
Шаг 6) Создайте еще один файл
Здесь ваша работа окупается, вы можете делать это снова и снова.
Вытащите код из
www/js/app.js
ссылок на $ и App.например
Положи это в
www/js/foo.js
В самом верху этого файла поместите:
Внизу поставьте:
Затем измените последнюю строку www / js / main.js на:
Это оно! Делайте это каждый раз, когда хотите поместить код в отдельный файл!
источник
r.js
препроцессор. Кроме того, вы на самом деле не рассмотрели проблему OP - просто предоставили общееrequire.js
руководство.Что касается вашего вопроса и комментариев, я предполагаю, что вы не хотите переносить свой код на фреймворк, такой как Backbone, или использовать библиотеку загрузчика, такую как Require. Вам просто нужен лучший способ организовать код, который у вас уже есть, самым простым из возможных способов.
Я понимаю, что прокручивать более 2000 строк кода, чтобы найти раздел, над которым вы хотите работать, раздражает. Решение состоит в том, чтобы разделить ваш код на разные файлы, по одному для каждой функции. Например
sidebar.js
,canvas.js
и т. Д. Затем вы можете объединить их вместе для производства с помощью Grunt, вместе с Usemin вы можете получить что-то вроде этого:В вашем html:
В вашем Gruntfile:
Если вы хотите использовать Yeoman, он предоставит вам шаблонный код для всего этого.
Затем для каждого файла вам необходимо убедиться, что вы следуете лучшим практикам и что весь код и переменные находятся в этом файле и не зависят от других файлов. Это не означает, что вы не можете вызывать функции одного файла из другого, дело в инкапсулировании переменных и функций. Что-то похожее на пространство имен. Я предполагаю, что вы не хотите переносить весь свой код в объектно-ориентированный, но если вы не против немного рефакторинга, я бы рекомендовал добавить что-то эквивалентное с так называемым шаблоном модуля. Это выглядит примерно так:
sidebar.js
Затем вы можете загрузить этот фрагмент кода следующим образом:
Это позволит вам иметь гораздо более удобный в сопровождении код без необходимости слишком много его переписывать.
источник
#sidebar #sortable
. Вы также можете сэкономить память, просто вставив код и сохранив два IETF.Используйте javascript MVC Framework для стандартной организации кода javascript.
Лучшие доступные фреймворки JavaScript MVC:
Выбор фреймворка JavaScript MVC требовал учета множества факторов. Прочтите следующую сравнительную статью, которая поможет вам выбрать лучший фреймворк на основе факторов, важных для вашего проекта: http://sporto.github.io/blog/2013/04/12/comparison-angular-backbone-can-ember/
Вы также можете использовать RequireJS с фреймворком для поддержки загрузки Asynchrounous js файлов и модулей.
Посмотрите ниже, чтобы начать загрузку модуля JS:
http://www.sitepoint.com/understanding-requirejs-for-effective-javascript-module-loading/
источник
Отнесите свой код к категории. Этот метод мне очень помогает и работает с любым js-фреймворком:
В предпочитаемом вами редакторе (лучше всего это Komodo Edit) вы можете свернуть, свернув все записи, и вы увидите только заголовки:
источник
Я бы посоветовал:
В вашем случае, Джессика, разделите интерфейс на страницы или экраны. Страницы или экраны могут быть объектами и расширяться из некоторых родительских классов. Управляйте взаимодействиями между страницами с помощью класса PageManager.
источник
Я предлагаю вам использовать что-то вроде Backbone. Backbone - это RESTFUL-поддерживаемая библиотека javascript. Ik делает ваш код более чистым и читаемым, а также эффективен при использовании вместе с requirejs.
http://backbonejs.org/
http://requirejs.org/
Backbone - это не настоящая библиотека. Он предназначен для структурирования вашего кода javascript. Он может включать другие библиотеки, такие как jquery, jquery-ui, google-maps и т. Д. Backbone, на мой взгляд, является наиболее близким подходом javascript к объектно-ориентированным структурам и структурам контроллера представления модели.
Также относительно вашего рабочего процесса. Если вы создаете свои приложения на PHP, используйте библиотеку Laravel. Он будет безупречно работать с Backbone при использовании с принципом RESTfull. Ниже ссылка на Laravel Framework и руководство по созданию RESTfull API:
http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/
http://laravel.com/
Ниже приведено руководство от nettuts. Nettuts имеет множество руководств в высоком качестве:
http://net.tutsplus.com/tutorials/javascript-ajax/understanding-backbone-js-and-the-server/
источник
Может быть, вам пора начать реализовывать целый рабочий процесс разработки, используя такие инструменты, как yeoman http://yeoman.io/ . Это поможет контролировать все ваши зависимости, процесс сборки и, если хотите, автоматическое тестирование. Для начала нужно много работать, но после его внедрения будущие изменения будут намного проще.
источник