如何将全局/公共variables添加到grunt-contrib-uglify输出

好的,所以我对Grunt和Node.js是新的。 我正在build立一个网站,并决定'main.js'文件变得太大了。 所以,我把它分开,现在我正在尝试使用Grunt将所有这些JS文件重新组合在一起。

我的问题是,我需要使所有这些JS文件中的所有function都可用的全局variables。 更具体地说,我们网站上的每个页面都通过body标签中的id来标识:

 <body id="home"> 

这些JS文件中的许多包含if语句,这些语句确保某些函数只在加载了相应的页面时才运行。 例如:

 if (page == 'home') { var title = "Home Page" $('.page-title').text(title); } 

注意pagevariables? 那个人是我需要提供给所有这些文件(grunt-contrib-uglify合并在一起之后)的人。 所以,我想我会分配一个新的“唯一”的variables名称,并使其全球。

我注意到, grunt-contrib-uglify在其文档中列出了一个' wrap '选项。 然而,没有例子给出如何使用它。

任何人都可以告诉我: – 如何使用'grunt-contrib-uglify'中的'wrap'选项 – 如果这是我正在尝试做的正确的grunt插件?

我有一个想法(作为最后的手段)是创build一个before.jsafter.js ,把我想要包装其他文件的开始和结束(分别)。 但是,我认为“包装”选项是我需要的,是的?

更新:这是一个链接到我的“合并”JS文件: main.js

并链接到我的Gruntfile: Gruntfile.js

我一直在寻找解决scheme的同样的问题。 但我想我find了答案。

在你的gruntfile中使用这个:

 uglify: { options: { wrap: true } } 

wrap属性的文档表明variables将在全局variables中可用,并查看似乎确实如此的生成的代码。 将string值传递给参数似乎创build了一个具有该名称的全局variables。

但是, wrap: true似乎使全局范围内的所有对象和属性都可用。 所以,而不是globals.page.title (我不能工作,无论如何),你可以使用page.title 。 更容易,更简单。

如果这符合你的目的,我会build议这样做。

好吧,这个很棘手,我已经被拖了一段时间…

你可以用grunt-contrib-uglify来做前端JS

创build多个文件

 SomeClass.js OtherClass.js main.js 

并使用一些模块(grunt-file-dependencies或grunt-contrib-concat)并设置它来连接你的文件。 然后在你的Gruntfile.js设置Gruntfile.js

 ... uglify: { options: { wrap: "myPublicObject", ... }, 

在文件(例如main.js )中,必须指定exportsvariables,整个文件可能如下所示:

 var otherClassInst = new OtherClass(); var someClassInst = new SomeClass(); exports = otherClassInst; 

现在究竟是什么

Uglify将select上级上下文( this )并在其上定义名为myPublicObject属性。 然后用函数包装你的源代码,并在这里创buildexportsvariables( 不要 在任何地方声明 var exports )。 最后,它将分配您导出到该属性。 如果你不指定任何东西(你不使用exports =),那么原始值是{} ,所以具有void对象的属性依然存在。

为了使这个超级清晰,

  1. 如果你把你的代码放到页面中,比如<script src="myminifiedfile.min.js"></script> ,那么优越的上下文是window => window.myPublicObjectOtherClass实例,而window.someClassInstOtherClasswindow.OtherClassundefined
  2. 这是不太可能的,但如果你只是复制缩小的结果的内容,并包含不同的function,你导出的对象将只能通过this["myPublicObject"] => this["myPublicObject"]包装不可见的东西,使它们可访问在优越的背景下。