【问题标题】:Import an external resource to grunt将外部资源导入到 grunt
【发布时间】:2014-06-12 10:19:32
【问题描述】:

我正在尝试使用 concat 将外部资源导入 gruntfile.js。但似乎并没有引起我的注意。我一直在谷歌搜索,但我发现的唯一信息是如何 cdnify 解决方案。

问题是我们在 CDN 上使用模块,并且只想定义 CDN 资源,而不是从 repo 下载并在本地链接。

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),

    concat: {
        dist: {
            src: [
                'https://test.com/cdn/waypoints.js',
                'https://test.com/plugins/hashchange/hashchange-1.4.js',
                'js/ssp-stickit-1.js',
                'js/global.js', 
            ],
            dest: 'js/scripts.js',
        }
    },

}

如果有人知道 gulp 是否可以做到这一点,那也是一种选择....

最好的问候

理查德

【问题讨论】:

    标签: gruntjs external cdn concat gulp


    【解决方案1】:

    您需要使用首先下载资源然后连接的任务。但这引出了一个问题,为什么要使用 CDN 脚本? CDN 通常用于客户端可能已经缓存的公共资源。如果您连接文件,您将不再利用该缓存。其中,你可能应该使用脚本的公共出口,例如 npm、bower、组件、github 等。

    但如果你仍然想这样做,这里有一个下载和连接的任务/示例:

    grunt.initConfig({
      urlconcat: {
        all: {
          src: [
            'https://test.com/cdn/waypoints.js',
            'https://test.com/plugins/hashchange/hashchange-1.4.js',
            'js/ssp-stickit-1.js',
            'js/global.js', 
          ],
          dest: 'js/scripts.js',
        },
      },
    });
    
    var fs = require('fs');
    var path = require('path');
    var request = require('request');
    var async = require('async');
    
    grunt.registerMultiTask('urlconcat', function() {
      var done = this.async();
      var options = this.options({
        separator: '\n',
      });
      async.eachSeries(this.files, function(file, next) {
        var out = '';
        async.eachSeries(file.orig.src, function(url, nextUrl) {
          if (grunt.file.exists(url)) {
            // If a file
            grunt.log.writeln('Concatenating ' + url);
            out += grunt.file.read(url) + options.separator;
            nextUrl();
          } else {
            // Otherwise assume a url
            grunt.log.writeln('Downloading ' + url);
            request(url).on('data', function(data) {
              out += data.toString();
            }).on('end', function() {
              out += options.separator;
              nextUrl();
            });
          }
        }, function() {
          grunt.file.write(file.dest, out);
          grunt.log.ok('Wrote ' + file.dest + '.');
          next();
        });
      }, done);
    });
    
    grunt.registerTask('default', ['urlconcat']);
    

    【讨论】:

    • 您好,感谢您的回答。我们希望将脚本基于 cdn 的原因是我们有几个人在不同的 sn-ps 上工作。这是提交给一个 GIT 存储库,它也是一个 CDN 服务器。然后,当我们想要包含 sn-p 时,不必在本地更新所有 repos,我们只需简单地引用 CDN。也许这只是愚蠢的,但感觉它会为我们节省很多时间。
    • 要使用上面的模块(我)需要安装请求(npm install request)和异步(npm install async)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2012-06-12
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多