【问题标题】:Gulp Env and PreprocessGulp 环境和预处理
【发布时间】:2014-05-31 22:04:23
【问题描述】:

在 Grunt 中,我曾经使用一个名为 env 的插件。这将允许我在特定构建中定义一个环境。我有 3 个版本。一个是 DEV,它将使用单独拆分的所有文件。 PROD 将连接所有内容,而 RELEASE 将连接和丑化。我希望在 Gulp 中做同样的事情。我确实看到了 Gulp 的预处理器,但没有定义环境。

问题是。我能做些什么?显然我不想一直定义所有的 JS 文件,也不想要 3 个不同的 HTML 页面有不同的 script 标签。

在我的 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'
    }
},

【问题讨论】:

    标签: node.js gruntjs preprocessor gulp env


    【解决方案1】:

    您可能应该使用 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 -->
    

    【讨论】:

      【解决方案2】:

      这就是我如何实现我认为你想要的。 我已经设置了一个文件夹,其中包含要预处理的 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 知道要重新加载哪个页面。

      我是在移动设备上写的,所以为了清楚起见,我可能会回来编辑,但解决这个谜题为我节省了大量的时间和精力。

      【讨论】:

      • 感谢 gulp-data 插件,这已经大大简化了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2017-09-22
      相关资源
      最近更新 更多