【问题标题】:Building deployable JavaScript with Grunt使用 Grunt 构建可部署的 JavaScript
【发布时间】:2013-12-30 17:46:15
【问题描述】:

我想知道其他人如何在 CMS 网站构建中自动化他们的 JavaScript 构建过程。

我目前使用 Grunt 来自动化 SASS->CSS 缩小,这非常有效,因为你不会用压缩代码覆盖你的 sass 文件。

你不能用 JavaScript 做同样的事情,因为如果你压缩它,你会覆盖你的 JS。

显然您可以构建 .min.js 文件,但是您必须手动更新 html 模板中的文件名。

如果你有一个 www 文件夹,然后是一个 build 文件夹,我也看到并完成了构建;构建文件夹获取所有缩小的资产。这很好,但根据我的经验,它往往只适用于较小的静态网站。

我们尝试过的一个想法是为生产 JS 创建一个 unminified-js 文件夹,然后 grunt 构建到一个脚本文件夹中,该文件夹从您的模板中引用。

我们将不胜感激地收到任何关于简洁流程的见解。

谢谢!

【问题讨论】:

    标签: php build content-management-system gruntjs minify


    【解决方案1】:

    也许我不清楚你在问什么,但你为什么不把你的缩小文件输出到你将用于生产的其他地方,并将原始 JS 文件放在一个单独的文件夹中,你可以编辑然后运行 ​​grunt并将它们输出到其他地方。这是我在最近的项目中使用的示例 grunt 文件。

    module.exports = function(grunt) {
    
    // Project configuration.
    grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concat: {
      appJs: {
        src: [
        './templates/*.js',
        './js/*.js'
        ],
        dest: '../js/featuredProduct.<%= pkg.version %>.js'
      }
    
    },
    handlebars: {
      all: {
        src: 'templates/*.hbs',
        dest: './templates/templates.js'
      },
      options: {
        namespace: 'Handlebars.templates'
      }
    },
    uglify: {
      options: {
        mangle: false
      },
      build: {
        files: {
          '../js/featuredProduct.<%= pkg.version %>.min.js' : ['../js/featuredProduct.<%= pkg.version %>.js']
        }
      }
    },
    watch: {
      handlebars: {
        files: './templates/*.hbs',
        tasks: ['handlebars', 'concat']
      },
      concat: {
        files: ['./js/**/*.js'],
        tasks: 'concat'
      },
      uglify: {
        files: ['../js/featuredProduct.<%= pkg.version %>.js'],
        tasks: 'uglify'
      }
    }
    });
    
    
    //This task is a multi task, meaning that grunt will automatically iterate over all less targets if a target is not specified.
    grunt.loadNpmTasks('grunt-contrib-handlebars');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    
    // Default task.
    grunt.registerTask('default', ['handlebars','concat','uglify']);
    };
    

    【讨论】:

    • 是的,我现在有一个非常相似的设置,只是没有 concat 阶段,因为我使用 require.js 进行模块加载。您是否总是在模板中引用 concat/uglified 版本?这就是我在提到必须在部署时的模板中将 script.js 引用更改为 script.min.js 的手动步骤时所得到的。我不想在生产环境中调试丑化的 JS。
    • 您还向文件添加了 pkg.version,因此您是否有手动步骤从 html 中更改脚本 src?
    • 哦,好吧,现在说得通了。我在一个称为 web 控制的环境中工作,有一个对我的 JS 的调用,它保存在一个元素中。因此,每当我使用 grunt 更新文件时,我都需要将新代码复制并粘贴到整个站点都会调用的元素中。所以我认为我们的情况略有不同。我在本地编辑未缩小版本,运行 grunt 任务,将代码复制到元素中,然后将元素推送到生产环境。
    【解决方案2】:

    connect 任务,您可以在其中为单个路径提供more than one location。当页面查找文件时,它会在数组的第一个文件夹中查找它。如果不存在,它将转到列表中的下一个位置,依此类推 - 但路径仍指向第一个位置。

    【讨论】:

    • 虽然我喜欢 Yeoman,但似乎这个答案不是他要问的(如何用 Grunt 做到这一点)。
    • @jakerella 我实际上是在说 Yeoman 告诉你它有一个整洁的 Grunt 任务应该会有所帮助。
    • 是的,我熟悉 Yeoman 和 connect,但它并不适合我概述的场景,例如 Web 应用程序生成器适用于手工制作的应用程序和非内容管理的东西。在使用现有的 CMS(在这种情况下基于 php,但有时是 .Net)时,这并不是我真正想要的。
    • @stikoo 然后你应该标记 PHP 和 .NET
    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2016-08-14
    • 2017-08-14
    • 2015-02-04
    相关资源
    最近更新 更多