How can I insert content into a file during a gulp build?
我设法使用名为gulp-insert的gulp插件完成任务,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| gulp.task('compile-js', function () {
// Minify and bundle client scripts.
var scripts = gulp.src([
srcDir + '/routes/**/*.js',
srcDir + '/shared/js/**/*.js'
])
// Sort angular files so the module definition appears
// first in the bundle.
.pipe(gulpAngularFilesort())
// Add angular dependency injection annotations before
// minifying the bundle.
.pipe(gulpNgAnnotate())
// Begin building source maps for easy debugging of the
// bundled code.
.pipe(gulpSourcemaps.init())
.pipe(gulpConcat('bundle.js'))
// Buffer the bundle.js file and replace the appConfig
// placeholder string with a stringified config object.
.pipe(gulpInsert.transform(function (contents) {
return contents.replace("'{{{appConfigObj}}}'", JSON.stringify(config));
}))
.pipe(gulpUglify())
// Finish off sourcemap tracking and write the map to the
// bottom of the bundle file.
.pipe(gulpSourcemaps.write())
.pipe(gulp.dest(buildDir + '/shared/js'));
return scripts.pipe(gulpLivereload());
}); |
我正在做的是读取应用程序的配置文件,该文件由npm上的config模块管理。使用var config = require('config');从服务器端代码获取我们的配置文件很容易,但是我们是单页应用程序,经常需要访问客户端的配置设置。为此,我将配置对象填充到Angular服务中。
这是在gulp构建之前的Angular服务。
1 2 3 4
| angular.module('app')
.factory('appConfig', function () {
return '{{{appConfigObj}}}';
}); |
占位符在字符串中,因此对于其他先处理文件的gulp插件而言,它是有效的JavaScript。 gulpInsert实用程序允许我像这样插入配置。
1 2 3
| .pipe(gulpInsert.transform(function (contents) {
return contents.replace("'{{{appConfigObj}}}'", JSON.stringify(config));
})) |
此方法有效,但感觉有些不客气。更不用说它必须缓冲整个捆绑的文件,以便我可以执行该操作。有没有更优雅的方式来完成同一件事?最好是一种允许流保持平稳流动而又不会在最后缓冲整个束的方法?谢谢!
- 我对此采取了一些不同的方法。我为每个环境创建了一个json文件。 dev.config.js,prod.config.js
-
诚然,这也有点怪,但也许稍微好点...我在React项目中使用envify和gulp-env。您可以执行以下操作。
gulpfile.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var config = require('config');
var envify = require('envify');
gulp.task('env', function () {
env({
vars: {
APP_CONFIG: JSON.stringify(config)
}
});
});
gulp.task('compile-js', ['env'], function () {
// ... replace `gulp-insert` with `envify`
}); |
工厂:
1 2 3 4
| angular.module('app')
.factory('appConfig', function () {
return process.env.APP_CONFIG;
}); |
434511
您是否已检查gulp-replace-task?
类似
1 2 3 4 5 6 7 8 9 10 11
| [...]
.pipe(gulpSourcemaps.init())
.pipe(replace({
patterns: [{
match: '{{{appConfigObj}}}',
replacement: config
}],
usePrefix: false
})
.pipe(gulpUglify())
[...] |
-
诚然,这也有点怪,但也许稍微好点...我在React项目中使用envify和gulp-env。您可以执行以下操作。
gulpfile.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var config = require('config');
var envify = require('envify');
gulp.task('env', function () {
env({
vars: {
APP_CONFIG: JSON.stringify(config)
}
});
});
gulp.task('compile-js', ['env'], function () {
// ... replace `gulp-insert` with `envify`
}); |
工厂:
1 2 3 4
| angular.module('app')
.factory('appConfig', function () {
return process.env.APP_CONFIG;
}); |
434511
您是否已检查gulp-replace-task?
类似
1 2 3 4 5 6 7 8 9 10 11
| [...]
.pipe(gulpSourcemaps.init())
.pipe(replace({
patterns: [{
match: '{{{appConfigObj}}}',
replacement: config
}],
usePrefix: false
})
.pipe(gulpUglify())
[...] |
-
诚然,这也有点怪,但也许稍微好点...我在React项目中使用envify和gulp-env。您可以执行以下操作。
gulpfile.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var config = require('config');
var envify = require('envify');
gulp.task('env', function () {
env({
vars: {
APP_CONFIG: JSON.stringify(config)
}
});
});
gulp.task('compile-js', ['env'], function () {
// ... replace `gulp-insert` with `envify`
}); |
工厂:
1 2 3 4
| angular.module('app')
.factory('appConfig', function () {
return process.env.APP_CONFIG;
}); |
434511
您是否已检查gulp-replace-task?
类似
1 2 3 4 5 6 7 8 9 10 11
| [...]
.pipe(gulpSourcemaps.init())
.pipe(replace({
patterns: [{
match: '{{{appConfigObj}}}',
replacement: config
}],
usePrefix: false
})
.pipe(gulpUglify())
[...] |
您是否已检查gulp-replace-task?
类似
1 2 3 4 5 6 7 8 9 10 11
| [...]
.pipe(gulpSourcemaps.init())
.pipe(replace({
patterns: [{
match: '{{{appConfigObj}}}',
replacement: config
}],
usePrefix: false
})
.pipe(gulpUglify())
[...] |
-
好的!看起来它确实按需要进行了中途替换,而不是等待所有这些都缓冲到最后。好发现:D
-
这个模块很棒!正则表达式替换功能非常强大。
诚然,这也有点怪,但也许稍微好点...我在React项目中使用envify和gulp-env。您可以执行以下操作。
gulpfile.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var config = require('config');
var envify = require('envify');
gulp.task('env', function () {
env({
vars: {
APP_CONFIG: JSON.stringify(config)
}
});
});
gulp.task('compile-js', ['env'], function () {
// ... replace `gulp-insert` with `envify`
}); |
工厂:
1 2 3 4
| angular.module('app')
.factory('appConfig', function () {
return process.env.APP_CONFIG;
}); |
- env是否仍在进行替换之前缓冲整个文件?
-
老实说,我不我猜是"否",因为在我的项目中env化似乎很快,但这只是一个猜测。
-
您是否最终得到一个包含所有文件内容的变量作为字符串,然后进行替换工作?如果这样做,则它将整个文件缓冲到内存中。我做这件事的方法也很快,只是我想坚持大吃大喝的流媒体范式,并尽可能地减少每一纳秒的时间。随着时间的流逝,这个文件只会越来越大。
-
现在,我知道您如何使用它解决问题了:D。我确实认为它可能像您怀疑的那样在流式配置中起作用。虽然我认为Id会找到他们在模块中使用的逻辑并将其复制。那不会觉得很hacky。我会看看 :)
-
ang我真的希望它能在流式传输时修改数据,但是它只是将缓冲区连接到一个大缓冲区中,并在将缓冲区刷新到输出之前一次对它进行替换操作。看来我需要更好地学习流并自己编写一些自定义代码。拆分和直通模块在这里似乎很有用。还是谢谢你的建议:)
-
啊。我知道了。好观察。
-
像UglifyJS2这样的@MrYellow工具将删除无法访问的代码。