У меня есть приложение, использующее библиотеку 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'));
});
Спасибо.
1 ответ
Проблема в том, что Closure Compiler работает со всеми источниками, помещая неиспользуемые функции в мой файл whole_application.js, например goog.ui.
Вам необходимо использовать флаги управления зависимостями. Основываясь на вашем примере, вам, вероятно, нужен режим STRICT
и точка входа goog:myApplication
. Компилятор удалит все файлы, которые не требуются вашему приложению.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.