如何将全局/公共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); }
注意page
variables? 那个人是我需要提供给所有这些文件(grunt-contrib-uglify合并在一起之后)的人。 所以,我想我会分配一个新的“唯一”的variables名称,并使其全球。
我注意到, grunt-contrib-uglify在其文档中列出了一个' wrap '选项。 然而,没有例子给出如何使用它。
任何人都可以告诉我: – 如何使用'grunt-contrib-uglify'中的'wrap'选项 – 如果这是我正在尝试做的正确的grunt插件?
我有一个想法(作为最后的手段)是创build一个before.js
和after.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
)中,必须指定exports
variables,整个文件可能如下所示:
var otherClassInst = new OtherClass(); var someClassInst = new SomeClass(); exports = otherClassInst;
现在究竟是什么
Uglify将select上级上下文( this
)并在其上定义名为myPublicObject
属性。 然后用函数包装你的源代码,并在这里创buildexportsvariables( 不要 在任何地方声明 var exports
)。 最后,它将分配您导出到该属性。 如果你不指定任何东西(你不使用exports =),那么原始值是{}
,所以具有void对象的属性依然存在。
为了使这个超级清晰,
- 如果你把你的代码放到页面中,比如
<script src="myminifiedfile.min.js"></script>
,那么优越的上下文是window
=>window.myPublicObject
是OtherClass
实例,而window.someClassInst
,OtherClass
和window.OtherClass
是undefined
。 - 这是不太可能的,但如果你只是复制缩小的结果的内容,并包含不同的function,你导出的对象将只能通过
this["myPublicObject"]
=>this["myPublicObject"]
包装不可见的东西,使它们可访问在优越的背景下。