我试图使用Grunt作为我的网络应用程序的构建工具。

我想至少有两个设置:

I.开发设置-从单独的文件加载脚本,没有串联,

所以我的index.html看起来是这样的:

<!DOCTYPE html>
<html>
    <head>
        <script src="js/module1.js" />
        <script src="js/module2.js" />
        <script src="js/module3.js" />
        ...
    </head>
    <body></body>
</html>

2生产设置-加载我的脚本缩小和连接在一个文件,

根据index.html:

<!DOCTYPE html>
<html>
    <head>
        <script src="js/MyApp-all.min.js" />
    </head>
    <body></body>
</html>

问题是,当我运行grunt dev或grunt prod时,我如何让grunt根据配置创建这些index.html ?

或者也许我在错误的方向上挖掘,它会更容易总是生成MyApp-all.min.js,但把它里面要么我所有的脚本(连接)或加载器脚本异步加载这些脚本从单独的文件?

你们是怎么做到的,伙计们?


当前回答

我发现了一个叫咕哝-dev-prod-switch的插件。它所做的只是根据您传递给grunt的——env选项注释掉它所寻找的某些块(尽管它将您限制为dev、prod和test)。

一旦你设置好它,你可以运行,例如:

Grunt serve——env=dev,它所做的就是注释掉被

    <!-- env:test/prod -->
    your code here
    <!-- env:test/prod:end -->

它会取消注释那些被

    <!-- env:dev -->
    your code here
    <!-- env:dev:end -->

它也适用于javascript,我用它来设置正确的IP地址连接到我的后端API。方块变成

    /* env:dev */
    your code here
    /* env:dev:end */

在你的情况下,它会像这样简单:

<!DOCTYPE html>
<html>
    <head>
        <!-- env:dev -->
        <script src="js/module1.js" />
        <script src="js/module2.js" />
        <script src="js/module3.js" />
        ...
        <!-- env:dev:end -->
        <!-- env:prod -->
        <script src="js/MyApp-all.min.js" />
        ...
        <!-- env:prod:end -->
    </head>
    <body></body>
</html>

其他回答

这个名为scriptlinker的任务看起来是在开发模式中添加脚本的简单方法。您可以先运行连接任务,然后以prod模式将其指向连接的文件。

这个答案不适合新手!

使用玉石模板…将变量传递给Jade模板是一个标准的用例

我用的是grunt(咕哝-contrib-jade),但你不必用grunt。只需使用标准的npm jade模块。

如果使用grunt,那么你的gruntfile会像这样…

jade: {
    options: {
      // TODO - Define options here
    },
    dev: {
      options: {
        data: {
          pageTitle: '<%= grunt.file.name %>',
          homePage: '/app',
          liveReloadServer: liveReloadServer,
          cssGruntClassesForHtmlHead: 'grunt-' + '<%= grunt.task.current.target %>'
        },
        pretty: true
      },
      files: [
        {
          expand: true,
          cwd: "src/app",
          src: ["index.jade", "404.jade"],
          dest: "lib/app",
          ext: ".html"
        },
        {
          expand: true,
          flatten: true,
          cwd: "src/app",
          src: ["directives/partials/*.jade"],
          dest: "lib/app/directives/partials",
          ext: ".html"
        }
      ]
    }
  },

现在我们可以很容易地访问Jade模板中grunt传递的数据。

与Modernizr使用的方法非常相似,我根据传递的变量值在HTML标记上设置了一个CSS类,并且可以根据CSS类是否存在从那里使用JavaScript逻辑。

如果使用Angular,这是非常棒的,因为你可以根据类是否存在来在页面中包含元素。

例如,我可能会包含一个脚本,如果类是存在的…

(例如,我可能在开发中包含实时重载脚本,但在生产中不包含)

<script ng-if="controller.isClassPresent()" src="//localhost:35729/livereload.js"></script> 

grunt-dom-munger使用CSS选择器读取和操作HTML。例如,从html中读取标签。删除节点、添加节点等等。

你可以使用grunt-dom-munger读取所有由index.html链接的JS文件,丑化它们,然后再次使用grunt-dom-munger修改index.html,只链接最小化的JS文件

我一直在寻找一个更简单、直接的解决方案,所以我结合了这个问题的答案:

如何放置if else块在gruntfile.js

并提出了以下简单的步骤:

Keep two versions of your index files as you listed and name them index-development.html and index-prodoction.html. Use the following logic in your Gruntfile.js's concat/copy block for your index.html file: concat: { index: { src : [ (function() { if (grunt.option('Release')) { return 'views/index-production.html'; } else { return 'views/index-development.html'; } }()) ], dest: '<%= distdir %>/index.html', ... }, ... }, run 'grunt --Release' to choose the index-production.html file and leave off the flag to have the development version.

没有新的插件添加或配置,没有新的任务。

我最近发现了这些Grunt v0.4.0兼容的任务:

grunt-preprocess

围绕npm模块预处理任务。

咕噜��

为将来的任务自动化环境配置的Grunt任务。

以下是我的Gruntfile.js的片段。

ENV设置:

env : {
    
    options : {
        
        /* Shared Options Hash */
        //globalOption : 'foo'
        
    },
    
    dev: {
        
        NODE_ENV : 'DEVELOPMENT'
        
    },
    
    prod : {
        
        NODE_ENV : 'PRODUCTION'
        
    }
    
},

预处理:

preprocess : {
    
    dev : {
        
        src : './src/tmpl/index.html',
        dest : './dev/index.html'
        
    },
    
    prod : {
        
        src : './src/tmpl/index.html',
        dest : '../<%= pkg.version %>/<%= now %>/<%= ver %>/index.html',
        options : {
            
            context : {
                name : '<%= pkg.name %>',
                version : '<%= pkg.version %>',
                now : '<%= now %>',
                ver : '<%= ver %>'
            }
            
        }
        
    }
    
}

任务:

grunt.registerTask('default', ['jshint']);

grunt.registerTask('dev', ['jshint', 'env:dev', 'clean:dev', 'preprocess:dev']);

grunt.registerTask('prod', ['jshint', 'env:prod', 'clean:prod', 'uglify:prod', 'cssmin:prod', 'copy:prod', 'preprocess:prod']);

在/src/tmpl/index.html模板文件中(例如):

<!-- @if NODE_ENV == 'DEVELOPMENT' -->
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
    <script src="../src/js/foo1.js"></script>
    <script src="../src/js/foo2.js"></script>
    <script src="../src/js/jquery.blah.js"></script>
    <script src="../src/js/jquery.billy.js"></script>
    <script src="../src/js/jquery.jenkins.js"></script>
    
<!-- @endif -->

<!-- @if NODE_ENV == 'PRODUCTION' -->
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    
    <script src="http://cdn.foo.com/<!-- @echo name -->/<!-- @echo version -->/<!-- @echo now -->/<!-- @echo ver -->/js/<!-- @echo name -->.min.js"></script>
    
<!-- @endif -->

我相信我的设置和大多数人不同,上面的有用性取决于你的情况。对我来说,虽然这是一段很棒的代码,但Yeoman的grunt-usemin比我个人需要的更健壮。

注意:我今天才发现上面列出的任务,所以我可能会错过一个功能和/或我的流程可能会改变。现在,我很喜欢咕噜预处理和咕噜env所提供的简单性和特性。:)


我不确定它是否会对任何人有任何帮助,但我已经在GitHub上创建了这个演示库,使用我上面概述的技术展示了一个完整的(和更复杂的设置)。