使用RequireJS的Javascript名称空间,为什么?
我目前正面临关于javascript上名称空间的争论,我需要社区的意见 场景: 负责这个项目的架构师不知何故致力于RequireJS,并且非常想使用它 我必须说,该应用程序是一个后台应用程序,以向导的形式部署,因此您可以在6页上来回浏览一些复杂的业务逻辑,最后填充一些我可以描述为流程请求的内容 好的,没有单页应用程序,在这些问题上没有什么特别之处。普通的backoffice web应用程序,多页,具有非常复杂的UI,其中每个页面都被请求到服务器,所有资源(css、javascript等)都必须在页面加载时加载 主要问题:了解我们所谈论的应用程序类型,首先为什么要使用RequireJS 第二个问题:为什么要试图说服人们在JavaScript中使用名称空间的最佳方法是使用RequireJS?我错过什么了吗 我的意见: 对我来说,这毫无意义。 在这里使用RequireJS很麻烦,因为没有按需加载资源,它们都是在页面加载时加载的(只是因为我们需要在页面加载时加载它们)。 我们至少需要支持IE8、Chrome、Firefox和Opera,而且我们已经在所有这些浏览器的资源加载方面遇到了很多麻烦。通过Require确保所有内容都按预期加载已经有很多技巧 对于名称空间,情况更糟。当然,它是有效的,但再一次,对我来说似乎很麻烦,在这个问题上实际上是非常有限的 我是不是错过了什么? 我需要第三个(或第100个)意见使用RequireJS的Javascript名称空间,为什么?,javascript,jquery,requirejs,javascript-namespaces,Javascript,Jquery,Requirejs,Javascript Namespaces,我目前正面临关于javascript上名称空间的争论,我需要社区的意见 场景: 负责这个项目的架构师不知何故致力于RequireJS,并且非常想使用它 我必须说,该应用程序是一个后台应用程序,以向导的形式部署,因此您可以在6页上来回浏览一些复杂的业务逻辑,最后填充一些我可以描述为流程请求的内容 好的,没有单页应用程序,在这些问题上没有什么特别之处。普通的backoffice web应用程序,多页,具有非常复杂的UI,其中每个页面都被请求到服务器,所有资源(css、javascript等)都必须在
- 你觉得这个怎么样
- 你用什么
- 为什么?
- 适当的模块化、关注点分离
- 无全球污染
- 没有名字冲突
- 按需加载或部署前优化
- 根据加载程序的不同,可以使用插件处理高级问题,如本地化资源或加载时编译
我非常喜欢这种加载程序,发现它们除了非常小的单页应用程序外,对任何东西都有用。在我个人看来,使用javascript模块系统几乎从来都不是一个坏主意。Requirejs也不是javascript模块唯一可能的加载程序(但可能是最流行的加载程序)。有些替代品是LabJ或HeadJ 这些装载机通常很容易使用(一开始没什么麻烦),但当项目越来越大时,它们会有很大帮助。它们避免了全局空间中的命名冲突,还可以通过最小化/优化模块在部署步骤中为您提供支持。最重要的事实是,它们允许您编写更多模块化的javascript代码
- 你有一些实用功能吗?只需创建一个实用模块
- 您在所有页面上都有一些需要的功能吗?将它们放在一个公共模块中
- 有些页面需要很多特定的javascript代码?为这些页面创建一个额外的模块,这样您就不必在其他页面上加载此代码
另外,请阅读RequireJS文档中的部分。我目前防止全球环境污染和名称冲突的解决方案是使用
$.extend
文件系统树如下所示:
RootFolder
+-> js
global.js
...
+-> views
index.js
page1.js
page2.js
...
index.html
page1.html
page2.html
所以它通常是一个包含所有应用程序共享代码的global.js文件,每个页面有一个特定的文件
对于名称空间,我喜欢$.extend,因此在每个js文件上我都有如下内容:
var app = app || {};
/* only one document ready block per view if needed */
$(document).ready(function(){
/* initialization code */
});
/* extend the app namespace with the Page1 code */
$.extend(app, {
page1: {
SayHi: function SayHi(name){
alert('Hi ' + name);
}
}
});
因此,您可以通过调用以下命令访问您的代码:
app.page1.SayHi("Alex");
使用此技术,您可以:
- 完全控制你的代码。没有魔法资源加载和你无法完全控制的奇幻东西
- 没有全球环境污染
- 没有命名冲突
- 名称空间树可以像您希望的那样深,您拥有自己的复杂性
- 您可以有多个js文件,它们实际上对同一命名空间级别做出贡献。这在辅助工具上特别有用
- 根据页面上包含的javascript文件,您可以拥有更大或更小的应用程序名称空间