requirejs和seajs的区别

JavaScript012

requirejs和seajs的区别,第1张

相同之处

RequireJS 和 SeaJS 都是模块加载器,倡导的是一种模块化开发理念,核心价值是让 JavaScript 的模块化开发变得更简单自然。

不同之处

两者的区别如下:

定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。SeaJS 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 服务器端。

遵循的规范不同。RequireJS 遵循的是 AMD(异步模块定义)规范,SeaJS 遵循的是 CMD (通用模块定义)规范。规范的不同,导致了两者 API 的不同。SeaJS 更简洁优雅,更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

社区理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。SeaJS 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

代码质量有差异。RequireJS 是没有明显的 bug,SeaJS 是明显没有 bug。

对调试等的支持有差异。SeaJS 通过插件,可以实现 Fiddler 中自动映射的功能,还可以实现自动 combo 等功能,非常方便。RequireJS 无这方面的支持。

插件机制不同。RequireJS 采取的是在源码中预留接口的形式,源码中留有为插件而写的代码。SeaJS 采取的插件机制则与 JavaScript 语言以及Node 的方式一致:开放自身,让插件开发者可直接访问或修改,从而非常灵活,可以实现各种类型的插件。

还有不少细节差异就不多说了。

总之,SeaJS 从 API 到实现,都比 RequireJS 更简洁优雅。如果说 RequireJS 是 Prototype 类库的话,则 SeaJS 是jQuery 类库。

最重要的

最后,向 RequireJS 致敬!RequireJS 和 SeaJS 是好兄弟,一起努力推广模块化开发思想,这才是最重要的。

LABjs

的核心是

LAB(Loading

and

Blocking):Loading

指异步并行加载,Blocking

是指同步等待执行。LABjs

通过优雅的语法(script

wait)实现了这两大特性,核心价值是性能优化。LABjs

是一个文件加载器。

RequireJS

SeaJS

则是模块加载器,倡导的是一种模块化开发理念,核心价值是让

JavaScript

的模块化开发变得更简单自然。

模块加载器一般可降级为文件加载器用,因此使用

RequireJS

SeaJS,也可以达成

LABjs

的性能优化目的。

RequireJS

SeaJS

都是很不错的模块加载器,两者区别如下:

1.

两者定位有差异。RequireJS

想成为浏览器端的模块加载器,同时也想成为

Rhino

/

Node

等环境的模块加载器。SeaJS

则专注于

Web

浏览器端,同时通过

Node

扩展的方式可以很方便跑在

Node

服务器端

2.

两者遵循的标准有差异。RequireJS

遵循的是

AMD(异步模块定义)规范,SeaJS

遵循的是

CMD

(通用模块定义)规范。规范的不同,导致了两者

API

的不同。SeaJS

更简洁优雅,更贴近

CommonJS

Modules/1.1

Node

Modules

规范。

3.

两者社区理念有差异。RequireJS

在尝试让第三方类库修改自身来支持

RequireJS,目前只有少数社区采纳。SeaJS

不强推,而采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

4.

两者代码质量有差异。RequireJS

是没有明显的

bug,SeaJS

是明显没有

bug。

5.

两者对调试等的支持有差异。SeaJS

通过插件,可以实现

Fiddler

中自动映射的功能,还可以实现自动

combo

等功能,非常方便便捷。RequireJS

无这方面的支持。

6.

两者的插件机制有差异。RequireJS

采取的是在源码中预留接口的形式,源码中留有为插件而写的代码。SeaJS

采取的插件机制则与

Node

的方式一致:开放自身,让插件开发者可直接访问或修改,从而非常灵活,可以实现各种类型的插件。

还有不少细节差异就不多说了。

总之,SeaJS

API

到实现,都比

RequireJS

更简洁优雅。如果说

RequireJS

Prototype

类库的话,则

SeaJS

jQuery

类库。

最后,向

RequireJS

致敬!RequireJS

SeaJS

是好兄弟,一起努力推广模块化开发思想,这才是最重要的。

一、前言

ocLoayLoad是AngularJS的模块按需加载器。一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题。但是当我们的网站渐渐庞大起来,这样子的加载策略让网速初始化速度变得越来越慢,用户体验不好。二来,分模块加载易于团队协作,减低代码冲突。

二、按需加载的对象

各个Controller模块、Directive模块、Server模块、template模板,其实这些都是一些

.js文件或者

.html文件

、按需加载的场景

1

路由加载(resolve/uiRouter)

基于uiRouter的resolve是在加载controller和template之前所执行的一系列操作,它帮助我们初始化我们所要前往的那一个视图。只有be

solved(操作完成),controller才会被实例化。因此,我们可以在resolve步骤里面加载我们所需要的controller。

$stateProvider

.state('index',

{

url:

'/',

views:

{

'lazyLoadView':

{

templateUrl:

'partials/main.html',

controller:

'AppCtrl'

}

},

resolve:

{

loadMyCtrl:

['$ocLazyLoad',

function($ocLazyLoad){

return

$ocLazyLoad.load('js/AppCtrl.js')

}]

}

})

其中,'js/AppCtrl.js'里面放着一个我们所需要的controller

angular.module('myApp')

.controller('AppCtrl',

['$scope',

function($scope){

//...

}])

2

依赖加载

在依赖项里面导入我们所需要的一系列模块(这里有一层'[

]'符合哦)

angular.module('gridModule',

[[

'bower_components/angular-ui-grid/ui-grid.js',

'bower_components/angular-ui-grid/ui-grid.css'

]]).controller('GridModuleCtrl',

['$scope',

function($scope){

//...

}])

3

Cotroller里动态加载

angular.module('myApp')

.controller('AppCtrl',

['$scope','$ocLazyLoad',

function($scope,

$ocLazyLoad){

$scope.loadBootstrap

=

function(){

$ocLazyLoad.load([

'bower_components/bootstrap/dist/js/bootstrap.js',

'bower_components/bootstrap/dist/css/bootstrap.css'

])

}

var

unbind

=

$scope.$on('ocLazyLoad.fileLoaded',

function(e,

file){

$scope.bootstrapLoaded

=

true

console.log('下载boot完成')

unbind()

})

}])

4

template包含加载(config)

如何处理我们所加载的html模板里面嵌套的controller呢?这里需要oc-lazy-load指令和$ocLazyLoadProvider的配置

/*template

A.html*/

<h1>hi

i

am

hzp

</h1>

<div

oc-lazy-load="gridModule">

<div

ng-controller="GridModuleCtrl">

<span>{{test}}</span><br/>

<div

ui-grid="gridOptions"

class="gridStyle"></div>

</div>

</div>

</div>

$ocLazyLoadProvider.config({

modules:

[{

name:

'gridModule',

files:

[

'js/gridModule.js'

]

}]

})

四、如何组织按需加载

分路由、按功能来区分、打包成不同的多个或单个controller.directive.server模块

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。