• 35. JS 模块化开发


    在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画 实现等,那个时候代码还是很少的。

    以前的代码 直接将代码写在<script>标签中即可

    随着ajax异步请求的出现,慢慢形成了前后端的分离

    为了应对代码量的剧增,我们通常会将代码组织在多个js文件中,进行维 护。但是这种维护方式,依然不能避免一些灾难性的问题。

    例如下面三个JS代码:

     user1.js

    var name = "bihu";
    var age = 18;
    var flag = false;
    
    var add = function(a,b){
        return a + b;
    }
    View Code

     user2.js

    var name = "bihu";
    var age = 18;
    var flag = false;
    
    var add = function(a,b){
        return a + b;
    }
    View Code

     Util.js

    if (flag) {
        console.log("我真是帅哥");
    } 

    学过的都知道,他打印还是不打印这句话,取决于 你引入JavaScript的顺序,因为这里变量名冲突了。

    如果开发大项目 怎么可能也是写在一起,如果有100个JS文件 但凡有一个冲突 你就很难找了。

    解决方案:

    1 . 最原始的方法就是使用 “闭包”

    2 .前端模块化开发

    幸运的是,前端模块化开发已经有了很多既有的规范,以及对应的实现方案。

    常见的模块化规范:  CommonJS、AMD、CMD,也有ES6的Modules




    ES模块化的  导出 和 导入

    首先 你写的JS 文件 ,引用文件的时候 type 写 module 即可,例如:

            <script src="js/A.js" type="module"></script>
            <script src="js/B.js" type="module"></script>
            <script src="js/C.js" type="module"></script>

    那么A 和 B  和 C 之间,他们都不是独立的,我在 ABC这三个js文件中写入: var i = 1; 、var i = 2;、 var i = 3;

    如果我打印i ,会发现报错:

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <title></title>
    </head>
    <body>
            
            <script src="js/A.js" type="module"></script>
            <script src="js/B.js" type="module"></script>
            <script src="js/C.js" type="module"></script>
            
            
            
            <script type="text/javascript">
                console.log(i)
            </script>
    </body>
    </html>
    View Code

     会说i没定义,因为每个js都是一个模块 独立的,所以呢取不到 变量 i 的值。

    解决方案就是 导入 和 导出:【export 和 import】




    导出:

    导出有很多种方式,导出的数据可以是变量、函数、对象...

    第一种导出方式:  【个人强烈推荐这种】

    如果我要访问 a中的 变量 i 【值是 1 】:

    例:
    export{
       aaa,bbb,ccc,ddd 
    }
    
    

    A.js:
    var i = 1;
    //直接写变量名即可,ES6写法 别忘了
    export{i}

    这样就吧一个模块中的数据导出了,导出了之后,如果你要用导出的值,那么你在要用的模块上这样导入:

    导入:

    这里新建Show.js 引入的时候也是module,然后在Show.js中导入A.js 导出的值,然后打印 i 

    import {i} from "./A.js"
    
    //这里已导入 i  
    //接下来直接打印:
    console.log(i)

    注意! 这里只能导入A.js的 i  ,因为只有你模块导出了 我才能 导入 你模块 导出 的值!!


    第二种方式导出:【直接导出变量】

    直接

    export var xxx = aaa;   

    export var yyy = bbb;   

    export var zzz = ccc;   

    这样既可...


    第三种方式导出:【直接导出 函数、类】

    直接导出函数:
    export function add(num1,num2){
        return num1 + num2;
    }
    
    

     直接导出类:

    var i = 1;
    //直接写变量名即可,ES6写法 别忘了
    export{i}
    
    export class Person{
        add(num1,num2){
            return num1 + num2;
        }
    }

    然后你在Show.js中导入:

    import {Person} from "./A.js"
    
    //这里已导入 Person
    //接下来直接赋值 然后使用函数:
    
    const show = new Person();
    
    console.log(show.add(1,9));

    还有一种:export default

    导入默认值,这个导入的时候可以任意取名字,但是只能导出一个 export default 。【export default在同一个模块中,不允许同时存在多个。】

    某些情况下,一个模块中包含某个的功能,我们并不希望给这个功能命名,而且让导入者可以自己来命名,这个时候就可以使用export default

    A.js :

    var str = "广东省";
    
    //只能导出一个 默认的  export default
    export default str;

    Show.js:

    //因为导出的是 默认值 ,所以下面 可以随便起名 不用花括号  下面起的是 address:
    import address from "./A.js"
    
    //下面打印出来的就是‘广东省’了
    console.log(address)

    因为只能有一个default ,那么你可以一起携带其他,例如:

    A.js :

    var str = "广东省";
    var i = 111;
    
    export default str;
    export {
       i
    }

    Show.js:

    //默认值直接取名,但是i不能取名 且  加 花括号!
    import address, {i} from "./A.js"
    
    //下面打印出来的就是‘广东省’ 和 1 了 了
    console.log(i)
    console.log(address)


    导出说了那么多种,但是第一种 和 默认用的多,

    导入有一种写法:导入全部值 且 取 别名

    如果我们希望某个模块中所有的信息都导入,一个个导入显然有些麻烦:

    通过*可以导入模块中所有的export变量

    但是通常情况下我们需要给*起一个别名,方便后续的使用:

    A.js:

    var name = "BiHu";
    var age = 18;
    var sex = '男';
    
    export {name,age,sex}

    Show.js:

    //这里导入全部,用 as 取个别名
    import  * as all from "./A.js"
    
    //下面打印 直接 all.x即可:
    console.log(all.name)
    console.log(all.age)
    console.log(all.sex)

    所以这就是 Js 模块化开发. 这个要掌握。

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15067964.html

  • 相关阅读:
    k8s 资源管理
    Kubernetes核心组件
    python复习
    项目发布
    tornado
    斯巴达系统(一)
    Tornado-第三篇-tornado支持websocket协议
    Tornado-第二篇-异步非阻塞
    Tornado-第一篇-搭建网页
    python--面向对象的特殊方法(反射,内置方法)
  • 原文地址:https://www.cnblogs.com/bi-hu/p/15067964.html
Copyright © 2020-2023  润新知