【发布时间】:2017-10-02 20:29:48
【问题描述】:
首先,对不起我的英语。
我正在开发一个系统的前端,其中我有一些 js 文件,这些文件将被连接并丑化为 app.js。没关系。但是,有些js文件会按需加载,即文件在不同的文件夹,按请求加载,消费丑陋的 app.js 。 我的问题是我需要 uglify 全局变量和命名函数,当我将 uglify 我的脚本时,文件不包含“上下文”相等。
我的结构:
|project
|scripts
|core
*.js
|utils
*.js
|pages
*.js
app.js
vendor.js
|templates
*.hbs // this files will be "compiled" to js with gulp-handlebars
我的构建结果:
|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)
为了便于解释,假设public/assets/js/app.js 有一个函数translate(a)。这只是接收变量'a'并返回值。
例如:
function translate(a) {
return a;
}
首先,文件 app.js 是我的 html 中唯一加载的文件。根据站点的语言环境,页面和模板目录的文件将动态加载到 html,使用 app.js 函数。
例如:public/assets/js/pages/*.js 或 public/assets/js/templates/*.js:
function consumeApp(a) {
return translate(a);
}
我的问题是没有为页面和模板目录中的 js 文件定义函数“translate”,因为 uglify 不适用于需要相同上下文/范围的不同文件。
我的开发依赖(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"
}
我的 gulpfile(仅 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'));
});
有人知道为什么吗? 谢谢。
【问题讨论】:
-
如果你将 mangle: { toplevel: true } 改为仅仅 mangle: false 会发生什么?
-
如果 mangle 为 false,我的全局变量和顶层函数不会被丑化,它将被其他文件访问。但我需要 uglify 全局变量和函数名称,并从另一个文件访问,该文件具有在 app.js 中创建的相同上下文 uglified。
-
基本上如果app.js中translate()改成x(),我希望其他文件中所有对translate()的调用也改成x()。
标签: javascript node.js gulp gulp-uglify