Как я могу загрузить свой собственный модуль js с помощью goog.provide и goog.require?

Несмотря на то, что форматирование, скорее всего, имеет большую часть Pythonic, это альтернативное решение, использующее инструмент more_itertools.rstrip .

import more_itertools as mit


def fmt(num, pred=None):
    iterable = str(num)
    predicate = pred if pred is not None else lambda x: x in {".", "0"}
    return "".join(mit.rstrip(iterable, predicate))

assert fmt(3) == "3"
assert fmt(3.) == "3"
assert fmt(3.0) == "3"
assert fmt(3.1) == "3.1"
assert fmt(3.14) == "3.14"
assert fmt(3.140) == "3.14"
assert fmt(3.14000) == "3.14"
assert fmt("3,0", pred=lambda x: x in set(",0")) == "3"

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

См. Также подробную информацию об этой сторонней библиотеке, more_itertools .

16
задан Lightbeard 17 December 2009 в 04:45
поделиться

5 ответов

Я разобрался, и это не очень сложно, но есть несколько моментов.

В принципе, вы можете использовать скрипт генерирующий зависимости calcdeps.py (вы должны прочитать calcdeps.py docs) в одном из нескольких режимов:

  1. Генерирующие депо. js file
  2. Соединяя все в один файл, опционально компилируя его с помощью закрывающего компилятора.

Для разработки следует использовать (1), так как это позволяет не запускать calcdeps.py после редактирования исходников JS, если только вы не внесете изменения в дерево зависимостей. Остальной ответ на этот вопрос, я еще не пробовал другой.

Вот что я сделал, чтобы сгенерировать его:

#!/bin/bash
cd closure-library/closure/goog
python ../bin/calcdeps.py -p ../../../js -o deps > ../../../my-deps.js

...предполагая следующую структуру каталога:

project/
  closure-library/ (as checked out from SVN)
  js/ (my JS code)
  app.html

(параметр -p обходит все js файлы в указанном каталоге, а в документации сказано, что при необходимости можно указать несколько каталогов для поиска)

Вышеуказанный вызов создает файл my-deps.js рядом с основным приложением.html, который я использую для запуска приложения. Созданный файл содержит информацию о моих JS файлах в js/ и выглядит следующим образом:

goog.addDependency('../../../js/controllers.js', ['proj.controllers'], []);
goog.addDependency('../../../js/ui.js', ['proj.ui'], ['proj.controllers']);

- где первая строка это путь к моему JS файлу относительно close-library/closure/goog/base. js (это важно!), второй массив - это список строк goog.provide-d, а последний массив - это список строк goog.require-d.

Now in app. html У меня есть:

<script src="closure-library/closure/goog/base.js"></script>
<script src="my-deps.js"></script>
<script>
  goog.require("proj.ui");
</script>
<script>
  // here we can use the required objects
</script>

Примечание:

  1. В дополнение к закрытию base.js, я включаю свой сгенерированный deps.js
  2. Как упоминалось в учебнике goog.com . require должен быть в отдельном теге сценария, потому что он добавляет тег сценария для загрузки требуемых сценариев, и они загружаются после завершения обработки текущего тега сценария.

Gotchas:

  1. Описанная выше проблема с путями, относящимися к base.js. goog.require создает загружаемый URL скрипта, объединяя базовый URL base.js (т.е. без имени листа base.js), и первый параметр goog.addDependency в deps.js.
  2. calcdeps.py не очень хорошо работает в Windows, в частности использует обратные слеши в deps. js string literals
  3. Если что-то не работает хорошо, вы можете просмотреть все проблемы, упоминающие calcdeps и убедиться, что у вас есть актуальная проверка.
13
ответ дан 30 November 2019 в 21:54
поделиться

Мне удалось заставить его работать, добавив следующее в deps. js :
goog.addDependency ('../../../ foo / bar.js', ['foo.bar'], []);

Firefox теперь отправляет http-запрос на / foo / bar.js , когда он встречает оператор goog.requires .

Однако файл содержит этот комментарий:
// Этот файл был автоматически создан GenJsDeps, пожалуйста, не редактируйте.

Согласно это , GenJsDeps то же самое, что calcdeps.py . Если вы посмотрите документацию, похоже, что есть переключатель -o deps , который повторно генерирует deps.js , поэтому он не редактируется вручную.

1
ответ дан 30 November 2019 в 21:54
поделиться

Да, вы должны использовать calcdepds.py. Я создал большой пост в блоге после множества проб и ошибок, чтобы найти лучший способ сделать это, я также просмотрел различия между dojo.require и goog.require:

http://apphacker.wordpress. com/2009/12/28/howto how-to use-goog-require-and-goog-provide- for-your-own-code/

1
ответ дан 30 November 2019 в 21:54
поделиться

Вот небольшой проект, над которым я работал и который может быть вам полезен: http://github.com/fintler/lanyard

Взгляните на build.xml, файл lanyard.js и все файлы, расположенные в src / geom / *.

В build.xml есть пример вызова calcdeps.py через ant для всех js, расположенных в src. Возможно, это не лучший способ делать что-то, но до сих пор он работал у меня.

0
ответ дан 30 November 2019 в 21:54
поделиться

Обновление!!!

Новая версия calcdeps.py немного меняет игру. Для создания вашего deps.js теперь нужно использовать флаг -d. Например:

python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -o deps -d path-to-closure-library/closure/ -p path-to-your-src/ --output_file=path-to-your-src/deps.js

Для компиляции:

python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -d path-to-closure-library/closure/ -p ./ --output_file=path-to-your-release/scripts.min.js -c path-to-compiler/compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" -f "--debug=true" -f "--process_closure_primitives=true" -f "--manage_closure_dependencies=true" -o compiled

Так что процесс стал намного проще, но вам придется использовать свои способности ESP, чтобы узнать об этом, так как это совершенно недокументировано. calcdeps.py теперь также не работает с Python 3.1 на windows, что также доставляет массу удовольствия. Несколько хаков заставили его работать для меня (которые я не буду приводить здесь, так как я не программист python и наверняка есть лучшие способы сделать это).

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

Guido

8
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

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