在Grunt中,我曾经使用过一个名为 env 的插件。这将允许我在特定构建中定义环境。我有3个版本。一个是DEV,它将使用单独拆分的所有文件。 PROD将连接所有内容,RELEASE将连接和uglify。我想在Gulp做同样的事情。我确实看到了Gulp的预处理器,但没有定义环境。
问题是。我能做什么?显然我不想一直定义所有JS文件,我不希望3个不同的HTML页面具有不同的脚本标记。
在我的HTML中我会有这样的东西:
<!-- @if NODE_ENV == 'DEVELOPMENT' -->
<script src="js/example1.js" type="text/javascript"></script>
<script src="js/example2.js" type="text/javascript"></script>
<script src="js/example3.js" type="text/javascript"></script>
<!-- @endif -->
<!-- @if NODE_ENV == 'PRODUCTION' -->
<script src="js/project.js" type="text/javascript"></script>
<!-- @endif -->
<!-- @if NODE_ENV == 'RELEASE' -->
<script src="js/project.min.js" type="text/javascript"></script>
<!-- @endif -->
我的grunt插件看起来像这样:
env: {
dev: {
NODE_ENV: 'DEVELOPMENT'
},
prod: {
NODE_ENV: 'PRODUCTION'
},
release: {
NODE_ENV: 'RELEASE'
}
},
preprocess: {
options: {
context: {
name: '<%= pkg.outputName %>',
version: '<%= pkg.version %>',
port: '<%= pkg.port %>'
}
},
dev: {
src: 'index.html',
dest: '<%= pkg.outputFolder %>/index.html'
},
prod: {
src: 'index.html',
dest: '<%= pkg.outputFolder %>/index.html'
},
release: {
src: 'index.html',
dest: '<%= pkg.outputFolder %>/index.html'
}
},
答案 0 :(得分:2)
你应该使用gulp-preprocess并在gulp
中做这样的事情var preprocess = require('gulp-preprocess');
.pipe(preprocess({context: { NODE_ENV: 'PRODUCTION', RELEASE_TAG: '2.6.4', DEBUG: false}}))
在你的html中使用这样的东西
<!-- @if NODE_ENV='DEVELOPMENT' -->
<a href="test?v<!-- @echo RELEASE_TAG -->" />
<!-- @endif -->
答案 1 :(得分:1)
以下是我如何完成我认为你想要的东西。 我已经设置了一个包含要预处理的html页面的文件夹。
在该文件夹中,我有对应于每个页面的文件夹,其中存储html片段和json文件。
每个JSON文件都有定义特定页面的页面资源的变量。
例如,假设我的页面是index.html。它看起来像这样:
<html>
<head>
... Meta stuff title etc ...
<!-- @ifdef pagecss1 -->
<link href="<!-- @echo pagecss1 -->" rel="stylesheet">
<!-- @endif -->
<!-- @ifdef pagecss2 -->
<link href="<!-- @echo pagecss2 -->" rel="stylesheet">
<!-- @endif -->
</head>
/// so on - same stuff with scripts at bottom
在我的该页面的JSON文件中,我要么pagecss1
定义。
然后我使用gulp.watch。
我不想写出整个事情,但每次子文件夹中的任何文件更改函数时,结果都会拦截已存在的全局上下文变量,并读取该页面的JSON文件。然后我使用node.util._extend
用页面特定的变量覆盖变量。然后,我将更改的对象作为上下文传递给预处理器任务。它快速闪电并返回一个回调,livereload知道要重新加载的页面。
我是在手机上写的,所以为了清晰起见,我可能会回来编辑,但解决这个谜语给我节省了大量的时间和精力。