У меня есть приложение, использующее библиотеку Openlayers. Openlayers использует библиотеку Closure.

Я хочу скомпилировать все (приложение, Openlayers и Closure Library) в один файл whole_application.js.

Проблема в том, что Closure Compiler работает со всеми источниками, помещая неиспользуемые функции в мой файл whole_application.js, например goog.ui.

Мое приложение написано на ES5 вокруг простого goog.require / goog.provide. (Еще хочу портировать на ES6)

Я хочу установить что-то вроде root.js - корень дерева зависимостей - файл со всеми goog.require, где я могу написать

goog.provide('myApplication');

goog.require('ol.source.Vector'); // openlayers module
goog.require('myApplication.someModule');

И будь счастлив. Есть ли способ это сделать?

Или я могу установить папку с исходным кодом, чтобы скомпилировать все внутри нее, и папку с зависимостями (например, openlayers / closure library), чтобы просто искать там необходимые зависимости?

Или, может быть, есть какие-то другие решения?

Компиляция / развертывание выполняется с помощью gulp / google-closure-compiler. Вот сценарий:

dirs.deploy = 'folder/with/my/sources'

var closureLibraryPath = './node_modules/google-closure-library/'

var closureLibraryExcludes = [
  "!**/*_test.js",
  "!**/*_perf.js",
  "!**/*tester.js",
  "!**/*promise/testsuiteadapter.js",
  "!**/*osapi/osapi.js",
  "!**/*svgpan/svgpan.js",
  "!**/*alltests.js",
  "!**/*node_modules**.js",
  "!**/*protractor_spec.js",
  "!**/*protractor.conf.js",
  "!**/*browser_capabilities.js",
  "!./doc/**.js"
];

gulp.task('deps-deploy', ['copy'], function (cb) {
  var exec = require('child_process').exec;
  exec(`
    cd ` + dirs.deploy + `/js &&
    chmod 644 deps.js &&
    "./` + closureLibraryPath + 'closure/bin/build/depswriter.py" ui.js --root_with_prefix="assets assets" > deps.js');
});


gulp.task('process-broadcast-assets', ['deps-deploy', 'copy', 'clean'], function() {
      var compilerOptions = {
    "compilation_level": "SIMPLE",
    "language_in": "ECMASCRIPT6",
    "language_out": "ECMASCRIPT5",
    "source_map_format": "V3",
    "warning_level": "QUIET",
    "formatting": "PRETTY_PRINT",
    "js_output_file": "whole_application.js",
    "output_wrapper": "%output%"
  };
  var paths = [].concat(dirs.deploy + '/js/assets/**/*.js', closureLibraryPath + 'closure/goog/**/*.js', closureLibraryPath + 'third_party/**/*.js' );
      paths = paths.concat(closureLibraryExcludes);
      return gulp.src(paths)
      .pipe(chmod(644))
      .pipe(closureCompiler(compilerOptions))
      .on('warning', onWarning)
      .on('error', onError)
      .pipe(gulp.dest(dirs.deploy + '/js'));
});

Спасибо.

0
Alexey Pitenko 15 Дек 2016 в 15:47

1 ответ

Лучший ответ

Проблема в том, что Closure Compiler работает со всеми источниками, помещая неиспользуемые функции в мой файл whole_application.js, например goog.ui.

Вам необходимо использовать флаги управления зависимостями. Основываясь на вашем примере, вам, вероятно, нужен режим STRICT и точка входа goog:myApplication. Компилятор удалит все файлы, которые не требуются вашему приложению.

0
Chad Killingsworth 17 Дек 2016 в 17:15