Erstens, tut mir leid mein Englisch.Uglify mehrere .js zu verschiedenen Ordnern (aber mit gleichem Umfang)
Ich entwickle das Frontend eines Systems, wo ich einige js-Dateien habe, die zu app.js verkettet und egglifiziert werden. Das ist ok. Aber einige js-Dateien werden nach Bedarf geladen, das heißt, die Dateien befinden sich in verschiedenen Ordnern, die auf Anforderung geladen werden, und verbrauchen die uglified app.js. Mein Problem ist, dass ich globale Variablen und Namen Funktionen hüpfen muss, und wenn ich meine Skripte hüpfen werde, enthalten die Dateien nicht den "Kontext" gleich.
Meine Struktur:
|project
|scripts
|core
*.js
|utils
*.js
|pages
*.js
app.js
vendor.js
|templates
*.hbs // this files will be "compiled" to js with gulp-handlebars
Mein Build Ergebnis:
|public
|assets
|js
|pages // separated files, uglified with app.js scope
*.js
|templates // separated files, uglified with app.js scope
*.js
app.js // concat and uglify app.js, core and utils directories
vendor.js // uglify separed keeping global variables (bower)
Zur Erleichterung der Erklärung, die Ansicht, dass public/assets/js/app.js
eine Funktion translate(a)
. Dies empfängt nur die Variable 'a' und gibt den Wert zurück. Ex:
function translate(a) {
return a;
}
Zum einen ist die Datei app.js die nur in meinem html geladen. Je nach Gebietsschema der Site werden die Dateien der Seiten- und Vorlagenverzeichnisse dynamisch in den HTML-Code geladen, wobei app.js-Funktionen verbraucht werden.
Ex: public/assets/js/pages/*.js
oder public/assets/js/templates/*.js
:
function consumeApp(a) {
return translate(a);
}
Mein Problem ist, dass die Funktion „translate
“ nicht für js Dateien in Seiten und Template-Verzeichnissen definiert, weil das nicht verunstaltet für verschiedene Dateien arbeiten, benötigen den gleichen Kontext/Bereich.
Mein dev abhängigkeit (package.json):
"devDependencies": {
"babel-core": "^6.4.0",
"babel-preset-es2015": "^6.3.13",
"babel-register": "^6.5.2",
"bower": "^1.8.0",
"del": "^1.1.1",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.1",
"gulp-babel": "^6.1.1",
"gulp-bower": "0.0.13",
"gulp-browserify": "^0.5.1",
"gulp-cache": "^0.4.6",
"gulp-concat": "^2.6.1",
"gulp-cssnano": "^2.1.2",
"gulp-declare": "^0.3.0",
"gulp-eslint": "^3.0.1",
"gulp-handlebars": "^4.0.0",
"gulp-htmlmin": "^3.0.0",
"gulp-imagemin": "^3.2.0",
"gulp-include": "^2.3.1",
"gulp-load-plugins": "^1.5.0",
"gulp-plumber": "^1.1.0",
"gulp-precompile-handlebars": "^2.0.5",
"gulp-sass": "^3.1.0",
"gulp-size": "^2.1.0",
"gulp-sourcemaps": "^2.6.0",
"gulp-sync": "^0.1.4",
"gulp-uglify": "^2.1.2",
"gulp-wrap": "^0.13.0",
"handlebars": "^4.0.10",
"jscs": "^3.0.7",
"uniq": "^1.0.1",
"webpack": "^2.6.1",
"webpack-stream": "^3.2.0"
}
Mein gulpfile (nur Abschnitt uglify):
const gulp = require('gulp');
const gulpsync = require('gulp-sync')(gulp);
const gulpLoadPlugins = require('gulp-load-plugins');
const del = require('del');
const concat = require('gulp-concat');
const webpack = require('webpack-stream');
const $ = gulpLoadPlugins();
// .... uglify tasks run after all be in public
gulp.task('scripts:uglify', gulpsync.sync([
'scripts:uglify-vendor',
'scripts:uglify-app'
]));
gulp.task('scripts:uglify-app',() => {
return gulp.src([
'public/assets/js/**/*js',
'!public/assets/js/vendor.js',
]).pipe($.uglify({
mangle: {
toplevel: true
}
}))
.pipe(gulp.dest('public/assets/js'));
});
gulp.task('scripts:uglify-vendor',() => {
return gulp.src('public/assets/js/vendor.js')
.pipe($.uglify({mangle: false}))
.pipe(gulp.dest('public/assets/js'));
});
jemand wissen, warum? Danke.
Was passiert, wenn Sie mangle ändern: { Toplevel: true} nur mangle: false? – Mark
Wenn mangle falsch ist, werden meine globalen Variablen und meine Funktionen in der obersten Ebene nicht verfälscht und es wird von anderen Dateien zugegriffen.Aber ich muss globale Variablen und Funktionen Namen und Zugriff von einer anderen Datei mit demselben Kontext in app.js hugified erstellt. –
Grundsätzlich, wenn translate() zu x() in app.js ändern, hoffe ich, dass alle Aufrufe von translate() in anderen Dateien auch zu x() wechseln. –