zoukankan      html  css  js  c++  java
  • 前段模块化sea.js(1)

    一、前端模块化-seajs
    https://www.zhangxinxu.com/sp/seajs/#intro
    1.提出问题
    1).全局变量污染,重名
    2)当引入工具库时,工具库中的变量名与我们的变量名或方法冲突
    3)使用工具库时,我们需要手动引入工具库到文件中,
    4)通用组更新了前段的基础类库,但是很难做到全栈更新
    5)业务组想使用通用组件,但是发现无法使用简单的几行代码就实现
    6)老产品上线更新功能,就只能在老的类库上进行修改开发
    7)业务合并时,容易出现前端代码冲突
    、、、、、
    解决方法:
    前端模块化--seajs
    2.seajs简介:
    SeaJS是一个适用于WEB浏览器的模块加载器,使用SeaJS可以更好的组织Javascript代码,,
    seajs是一个纯粹的模块加载器,他只解决一个问题:前端代码模块化,通过seajs,可以将大量的js代码封装成一个个小模块。然后轻松的实现模块的加载重用和依赖的管理
    3.seajs的获取与安装
    1).终端安装
    npm i spm -g
    npm i seajs
    2)页面直接引入
    github上面获取seajs文件:https://github.com/seajs/seajs
    引入:<script src='./lib.sea,js'></script>
    调用:<script>
    console.log(seajs.version);
    </script>

    4.定义模块
    define()用于定义模块,一个js文件就是一个模块,只能使用一个define()来定义,如果使用多个,只会认最后一个
    模块管理:在html文件中调用主模块:
    seajs.use('main',function(data){
    //data是主模块返回的内容
    })

    语法:
    define()只有一个参数,
    参数是字符串:就是一个字符串模块
    参数是数字:就是一个数字模块
    参数是对象:就是一个对象模块
    参数是函数(最常用):
    这个函数中可以有三个参数:
    Require:用于引入其他子模块
    Exports:用于返回接口对象
    Module:模块的module属性
    define()有两个参数
    第一个参数:数组 模块所依赖的子模块数组集合
    第二个参数:define([],function(Require,Exports,Module){})

    define()有三个参数:
    第一个参数:表示该模块的别名
    第二个参数:数组 模块所依赖的额子模块数组集合
    第三个参数: 是define([],function(Require,Exports,Module){})
    注意:
    1)当传递模块别名时,该模块的别名应该与该模块的文件名字一样,可以使用别名调用模块,建议别名与文件名一样
    2)当不传递别名时,该模块的名称与文件名字一样。路径为相对sea.js文件所在文件夹的相对路径
    3)使用define()定义模块时,当一个文件中出现多个define时,只有最后一个有效,其他的都将被覆盖
    5.引用模块 require()
    html引入主模块使用seajs.use,模块引入其他模块使用require()
    规则:
    1)require()不能被简写,重写
    2)require()不能被重定义】
    var req=require;
    function require(){}
    function fun(){
    var require=1233;
    }
    function fun(require){}
    //以上四种情况都是不合法的

    3)require的参数只能是完整的字符串,不能拼接,比如:
    var a='ma';
    require(a+'in');不允许

    注意:
    1)require的参数表示模块的路径,路径是相对于sea.js文件所在文件夹为根目录的相对路径,引入的是模块,.js是文件的后缀,可以省略
    2)当require引入一个已经定义了模块名称(别名,三个参数)的模块时,在引入时,首先在该模块的依赖模块集合中将该模块的路径引入进来,然后使用require(name)引入模块
    总结:
    1)如果有别名,全部加别名,用别名调用,路径都要写在父模块的依赖集合,子模块调用时直接调用别名
    2)如果没有别名,全部不要加别名,引入直接使用require(src)引入即可,模块定义只能有一个参数
    3)不要阴阳调用(有别名和没有别名的同时调用)
    6.模块接口返回 exports
    模块的接口,当模块执行结束后向上级返回内容(暴露接口)时使用
    四种返回方式:
    1)直接对exports添加属性:
    exports.color=‘red’
    2)使用module定义:module.exports={color:'blue'}
    3)使用module定义:module.exports.color='green'
    4)使用return:return{color:'purple'}


    需要注意的是:
    1)一个模块只能使用一个接口返回方式。只能返回一个内容
    2)不能对exports对象直接赋值,可以增加属性和值:
    exports.name='lisi';exports.age=23;

    或者给module.exports赋值对象
    module.exports={}

    7.module 模块属性
    module中有很多属性。都是模块的属性
    1)dependencies:['header/skin/skin']
    表示当前模块所引用的依赖集合
    2)deps:{}
    也表示依赖集合(对象集合)
    3)exports:{color:"cyan"}
    模块返回接口内容
    4)id:“hahah”
    模块别名
    5)uri:“file:///Applications/XAMPP/xamp......”
    如果模块没有别名,id=uri
    如果没有别名,uri表示该模块文件的绝对路径,如果有别名,想要引入模块,就要引入路径(uri),在调用别名(id)
    8.异步加载 require.async
    require方法的异步加载与use是比较类似的,在页面初始化时,使用use异步加载主模块,如果在模块中想要使用异步加载子模块,可以使用require.async()
    语法:
    require.async(path,fn);

    path:字符串或者数组,表示需要加载的依赖的路径
    fn:模块加载结束的回调函数,该函数的参数表示前边加载模块的回调函数内容,如果第一个参数是数组,那么回调函数的参数顺序就是数组的顺序
    注意:
    如果有if语句判断加载那个模块
    同步:多个模块都会被加载,但是执行为真的分支,这个分支内容被加载,另一个分支不被引用
    异步:哪个分支为真,加载那个分支,并引用,另一个分支不会被加载也不会被引用
    加载:就是浏览器经文件下载下来

  • 相关阅读:
    2019/10/9 CSP-S 模拟测
    简单的面向对象
    魔术变量
    函数
    全局变量
    超级全局变量
    for循环
    while循环
    php数组排序
    python打造XslGenerator
  • 原文地址:https://www.cnblogs.com/txf-123/p/11550560.html
Copyright © 2011-2022 走看看