SeaJS基础知识

模块的加载
Sea.js 是一个模块加载器,模块加载器需要实现两个基本功能:
实现模块定义规范,这是模块系统的基础。
模块系统的启动与运行。
核心是 module.js 文件。

模块系统的启动
在 Sea.js 里,要启动模块系统很简单,如:
<script src="http://skybirdzw.blog.163.com/blog/path/to/sea.js"></script>
<script>
  seajs.use('./main');
</script>
seajs.use用来在页面中加载模块。可以一次加载一个或多个模块,如:
//加载模块 main,并在加载完成时,执行指定回调
seajs.use('./main', function(main) {
  main.init();
});
//并发加载模块 a 和模块 b,并在都加载完成时,执行指定回调
seajs.use(['./a', './b'], function(a, b) {
  a.init();
  b.init();
});
具体相关细节,阅读:https://github.com/seajs/seajs/issues/266

最佳实践
一、seajs.use 理论上只用于加载启动,不应该出现在 define 中的模块代码里。在模块代码里需要异步加载其他模块时,推荐使用 require.async 方法。
这里区分了同样用于加载模块的seajs.use和require的区别!
二、引入 sea.js 时,可以把 sea.js 与其他文件打包在一起,可提前合并好,或利用 combo 服务动态合并。无论哪一种方式,为了让 sea.js 内部能快速获取到自身路径,推荐手动加上 id 属性:
<script src="http://skybirdzw.blog.163.com/blog/path/to/sea.js" id="seajsnode"></script>
加上 seajsnode 值,可以让 sea.js 直接获取到自身路径,而不需要通过其他机制去自动获取。这对性能和稳定性会有一定提升,推荐默认都加上。

以上内容来源于Sea.js官网(http://seajs.org/docs/#docs)

------------------------------------------------- 屌丝专属分割线 -------------------------------------------------------
再上自己的测试代码:
测试目录结构:

 
test1.js
//判定当前页面是否有 CMD 模块加载器
if (typeof define === "function" && define.cmd) {
    //可以使用如Sea.js等CMD模块加载器
    define(function (require, exports, module) {
        exports.sayHello = function () {
            alert('HelloWorld');
        };
    });
}

test2.js
if (typeof define === "function" && define.cmd) {
    define(function (require, exports, module) {
        var jsonObj = require("./json"); //注意此时的引用路径区别
        //exports通常用法:
        exports.sname = jsonObj.fname;
        exports.sayHello = function () {
            alert("My name is " + jsonObj.fname + ",i'm " + jsonObj.age + " years old.");
        };
        exports.response = function () {
            alert(module.uri); //module.uri表示当前模块的资源路径
        };

        /************ exports另一种用法 *************/
        /*
        module.exports = {
            sname:jsonObj.fname,
            sayHello:function () {
                alert("My name is " + jsonObj.fname + ",i'm " + jsonObj.age + " years old.");
            },
            response: function () {
                alert(module.uri); //module.uri表示当前模块的资源路径
            }
        }
        */
        //对外提供接口两种方法:exports和module.exports的比较
        // exports 参数是 module.exports 对象的一个引用。只通过 exports 参数来提供接口,有时无法满足开发者的所有需求。 比如当模块的接口是某个类的实例时,需要通过 module.exports 来实现。
        //也就是说,不能直接这样使用:exports={}(经测试确认);正确的方式是:module.exports={}。

    });
}

json.js
//判定当前页面是否有 CMD 模块加载器define.cmd
if (typeof define === "function" && define.cmd) {
    // 有 Sea.js 等 CMD 模块加载器存在
    define({ "fname": "wede.zhao", "age": 19 });
}

SeaJs.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="seaJs1.aspx.cs" Inherits="SeaJs.seaJs1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="/Scripts/sea.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <script type="text/javascript">
        seajs.use(['./Scripts/lib/test1', './Scripts/lib/json', './Scripts/lib/test2'], function (a, b, c) {
            a.sayHello();
            alert(b.fname); //得到一个json对象
            c.response();
        })
    </script>
    </div>
    </form>
</body>
</html>

posted @   skybirdzw  阅读(1207)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示