好问题!
1) Uglify 将重新排序目标文件中的函数,以便函数定义在顶部,函数执行在底部,但似乎它会保留函数执行的顺序。
这意味着如果您确保在 Gruntfile 的 Uglify 配置中首先提到 jQuery,则 jQuery 运行以定义其全局函数的函数将被放在首位。
我使用这个配置:
uglify: {
options: {
sourceMap: true
},
build: {
files: {
'public/all.min.js': ['public/js/vendor/jquery-1.10.2.min.js', 'public/js/*.js'],
}
}
}
2)我认为没有一种明确的方法可以做到这一点。这取决于你有什么样的 web 框架、模板框架和什么样的需求。我使用 express + jam,在我的主要玉石布局中,我有:
if process.env.NODE_ENV === 'production'
script(src='/all.min.js')
else
script(src='/js/vendor/jquery-1.10.2.min.js')
script(src='/js/someScript.js')
script(src='/js/otherScript.js')
在我的 package.json 我有:
"scripts": {
"postinstall": "grunt"
},
这意味着当我npm install
在部署(在 Heroku 上)运行时,运行 grunt 以缩小/合并文件,并且当使用NODE_ENV=production
缩小的客户端 JavaScript 启动应用程序时。在本地,我得到了原始客户端 javascript,以便于调试。
两个缺点是:
- 我必须保持两个脚本文件列表同步(在 Gruntfile 和 layout.js 中)我通过
*.js
在 Gruntfile 中使用来解决这个问题,但这可能并不适合所有人。您可以将 javascript 列表放在 Gruntfile 中并从中创建一个翡翠模板,但对于大多数项目来说这似乎有点过分了。
- 如果您不信任您的 Grunt 配置,您基本上必须使用
NODE_ENV=production
本地测试运行应用程序,以验证缩小是否按您预期的方式工作。