【问题标题】:Grunt.js: handle two functions with same name in generated js fileGrunt.js:处理生成的 js 文件中同名的两个函数
【发布时间】:2018-07-02 00:56:33
【问题描述】:

我有这个问题: 为了重构现有项目的前端部分,我尝试在其中使用 Grunt 编译器。本项目结构如下:

file1.jsp loads file1.js
file2.jsp loads file2.js

所以从 grunt 生成的 javascript 文件包含 file1 + file2。 问题是: 如果在 file1.js 我有:

$(document).on('ready', function()...)

var funct = function() {
...
};

$('.class').on('click', function(){...})

而且在 file2 中我还有另一个定义 funct 变量和 jquery 部分,以及生成的 javascript 文件 file1.jspfile2 .jsp 调用两个相同的函数。我想保留以前的行为,但我也想加载单个 js 文件,而不是在不同的 jsp 页面中加载多个 js 文件。

更新

我几句话,我有这样的结构:

js
 - eu
 - folder1
 -- file1.js
 - folder2
 -- file2.js
...

我想要做的是:缩小 js/eu 文件夹中的所有 js 文件,而不是连接所有缩小的文件并将 applicationScripts.min.js 文件加载到我的 index.jsp 中,而不是加载相关 jsp 中的所有单个文件文件。

Gruntfile.js 是:

concat: 
  { options: 
    { separator: '\n' }, 
    dist: { 
      src: [ 'js/eu_min/**/*.min.js' ], 
      dest: 'js/applicationScripts.min.js' } }, 
uglify: 
  { options: 
    { pretty: true }, 
    dist: { 
      files: { 
        expand: true, 
        src: "js/eu/**/*.js", 
        dest: "js/eu_min/", 
        ext: ".min.js" } } }, 
watch: { files: [ 'js/eu/**/*.js' ], 
tasks: [ 'uglify', 'concat' ] }

感谢您的支持

【问题讨论】:

  • 您无法修改源文件吗?或者,您是否尝试过预先丑化这两个文件?
  • 嗨@ryanwebjackson,感谢您的回答。修改源文件非常复杂(我已经简化了示例)。对于最后一部分,你能解释得更好吗?再次感谢
  • 您所要做的就是将代码放在一个命名空间中,例如一个 IIFE,然后重复的变量名就不是问题了。

标签: javascript jquery jsp gruntjs


【解决方案1】:

尝试使用 Grunt 的 Uglify 插件: https://github.com/gruntjs/grunt-contrib-uglify

这会缩小代码,其中包括将变量名称更改为简短的随机字符。

在合并文件之前执行此操作,因为如果事先将它们合并,解析器将假定它们是同一个变量。

【讨论】:

  • 所以如果我有以下结构: <br> jsp <br> - file1.jsp <br> - file2.jsp <br> js <br> - folder1 <br> - file1.js <br> - folder2 <br> - file2.js 我必须先运行 uglify 而不是 concat。我必须如何配置 uglify 函数才能读取 js 根文件夹中的所有子文件夹和 js?
  • 尝试类似“[js-root-folder]/**/*.js”的东西。通配符语法称为 minimatch 表达式。
  • 类似concat: { options: { separator: '\n' }, dist: { src: [ 'js/eu_min/**/*.min.js' ], dest: 'js/applicationScripts.min.js' } }, uglify: { options: { pretty: true }, dist: { files: { expand: true, cwd: "js/eu", src: "js/eu/**/*.js", dest: "js/eu_min/", ext: ".min.js" } } }, watch: { files: [ 'js/eu/**/*.js' ], tasks: [ 'uglify', 'concat' ] }
  • 给了我这个错误:Warning: pattern.indexOf is not a function Use --force to continue.。我想要做的是:缩小js/eu文件夹中的所有js文件,而不是连接所有缩小的文件并将applicationScripts.min.js文件加载到我的index.jsp中,而不是将所有单个文件加载到相关的jsp文件中
  • 你能把这个细节添加到你的问题中吗?
【解决方案2】:

冲突的变量名称或方法是许多开发人员将命名空间用于其逻辑的主要原因。这可以有不同的形式。一种方法是将您的逻辑包装在 IIFE 或立即调用的函数表达式中

(function(){
    var funct = function() {
    ...
    };

    $('.class').on('click', function(){...})
}());

它的作用是将逻辑放入一个立即调用的匿名函数中。 IIFE 中的元素,只要您正确地确定它们的范围,就只会存在于该函数中,因此执行相同类型命名空间的多个文件不会相互冲突。

【讨论】:

  • 感谢您的回答,但我的问题有所不同。我不想使用多个文件,我想使用 grunt 来使用一个文件,并且我想避免相同命名的方法或变量之间的冲突
  • @user10011121 你仍然可以做你现在正在做的事情。您可以在任何文件中使用命名空间。
猜你喜欢
  • 2017-01-16
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2021-06-04
  • 2018-09-30
  • 2014-01-28
  • 2018-01-14
相关资源
最近更新 更多