美文网首页佛系前端
sea.js的同步魔法

sea.js的同步魔法

作者: 前端司南 | 来源:发表于2019-08-26 13:54 被阅读0次

前些时间也是想写点关于CMD模块规范的文字,以便帮助自己理解。今天看到一篇知乎回答,算是给了我一点启发。

同步写法却不阻塞?

先上一个sea.js很经典的模块写法:

// 定义一个模块
define(function(require, exports, module) {
  // 加载jquery模块
  var $ = require('jquery');
  // 直接使用模块里的方法
  $('#header').hide();
});

按道理加载模块,就是需要等jquery.js加载完毕才能使用,应该是一个异步的过程,为什么可以写成同步的形式呢?这是用了什么黑科技?

原来作者玉伯大佬用了一个小魔法来“欺骗”我们。而卢勃大神在知乎给了一个很精彩的解释,这里直接分享下:

sea.js同步写法解释

也就是说,require.jssea.js都是在执行模块前预加载了依赖的模块,并没有比require.js显得更“懒加载”,只是所依赖模块的代码执行时机不同。require.js加载时执行,而sea.js是使用时执行。

其实从代码的写法也看得出来,require.js的依赖模块在加载后便有了执行结果,并作为回调函数的实参传入。

  • reuiqre.js写法:
// 加载完jquery.js后,得到的执行结果$作为参数传入了回调函数
define(['jquery'], function($) {
  $('#header').hide();
});
  • sea.js写法:
// 预加载了jquery.js
define(function(require, exports, module) {
  // 执行jquery.js模块,并得到结果赋值给$
  var $ = require('jquery');
  // 调用jquery.js模块提供的方法
  $('#header').hide();
});

从这一点上来看,两者在性能上并没有太多差异。因为最影响页面渲染速度的当然是资源的加载速度,既然都是预加载,那么加载模块资源的耗时是一样的(网络情况相同时)。

而模块代码的执行时机并没有那么影响性能(除非你的模块太大),现在的js引擎如V8引擎足够强,没什么压力。

懒加载是否存在?

懒加载是存在的。我刚才说的sea.js并没有比require.js更显得“懒加载”是指模块加载的时机上两者是一致的,都是预先加载,而不是说不能懒加载。

比如说,有一个模块,页面渲染时,我不需要加载使用,但是在做了某种交互时(比如点了按钮),才需要加载使用,这个时候“懒加载”的作用就体现了。下面以require.js举个实例:

require.config({
    baseUrl: './assets/js/',
    paths: {
        modulea: 'module-a',
        moduleb: 'module-b'
    }
})

require(["modulea"], function(modulea) {
    var btnNode = document.querySelector('#btn-load');
    var node1 = document.createElement('span');
    node1.innerText = '模块A已经加载!'
    btnNode.insertAdjacentElement('beforebegin',  node1)
    btnNode.addEventListener('click', function() {
        require(["moduleb"], function(moduleb) {
            var node2 = document.createElement('span');
            node2.innerText = '模块B已经加载!'
            btnNode.insertAdjacentElement('afterend',  node2)
        });
    })
});
  • 页面渲染时只加载模块A

    页面渲染时只加载模块A
  • 点击按钮后加载模块B

    点击按钮后加载模块B

总结

虽然AMDCMD两种思想有一些差异,但都不失为一种优秀的模块化方案,为大佬们打call!

首发链接

相关文章

  • sea.js的同步魔法

    前些时间也是想写点关于CMD模块规范的文字,以便帮助自己理解。今天看到一篇知乎回答,算是给了我一点启发。 同步写法...

  • seajs的使用方法

    为什么使用 Sea.js ? Sea.js 追求简单、自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块...

  • require.js和sea.js的区别

    require.js和sea.js的区别 首先原理上的区别 sea.js遵循CMD规范.书写方式类似node.js...

  • sea.js

    sea.js [TOC] 代表sea.js 一、CMD规范: 1、申明 一个模块就是一个文件,申明自己的文件js的...

  • sea.JS

    sea.JS符合cmd规范的模块加载器。当页面中有多个js文件时,使用sea.JS会让代码更好写,更易懂。 模块定...

  • 前端模块化开发--Sea.js

    Sea.js 是一个成熟的开源项目,核心目标是给前端开发提供简单、极致的模块化开发体验。使用 Sea.js,在书写...

  • sea.js

  • CMD 模块定义规范

    在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definiti...

  • 【11】孩子们该如何更好地阅读之二

    1.同步法:发挥思维的”魔法” 同步法就是阅读时想象和联想。1、用想象来画画,一边用眼晴看书,一边用眼晴画画...

  • CMD

    CMD 模块定义规范 在Sea.js中,所有JavaScript模块都遵循CMD(CommonModuleDefi...

网友评论

    本文标题:sea.js的同步魔法

    本文链接:https://www.haomeiwen.com/subject/rbbrectx.html