zoukankan      html  css  js  c++  java
  • js中的模块化开发(前端、后端)

    js中的模块化开发

    后端的模块化开发使用commenJs,使用路由形成入口文件,每一个接口是一个文件

    • 先看不使用模块化开发的后端代码(随手写的简单代码)
    var http=require("http");
    var querystring=require("querystring");
    var server=http.createServer(function(req,res){  //创建服务
        var data="";
        req.on("data",function(_data){
           data+=_data;
        });
        req.on("end",function(){
            // console.log(req.headers.abc);
            if(data.trim().length===0) data=req.url.split("?")[1];   
            else{
                try{
                    data=JSON.parse(data);
                }catch(error){
    
                }
            }
            if(typeof data==="string"){
                try{
                    data=querystring.parse(data);
                }catch(error){
                    res.end("错误的消息");
                    return;
                }
            }
            if(!data){
                res.end("错误的消息");
                return;
            }
            res.writeHead(200,{     //响应头  解决跨域问题
                "content-type":"text/html;charset=utf-8",
                // "Access-Control-Allow-Headers":"*",//请求头跨域
                 "Access-Control-Allow-Origin":"*",
                //  cors跨域
                });
           res.write((data.user? data.user : "你没有user")+"欢迎再次光临");  //返回内容
            res.end();
               
        })
    });
    server.listen(4006);   //侦听服务
    }
    
    • 使用commenJs的模块化开发 ,使用路由,如果接口多,可以使用一级路由作为文件入口,调用多个子级路由
      后端主文件
    var http=require("http");
    var querystring=require("querystring");
    function createServers(route){        //由一级路由传入数据  如果是多个接口,一级传进来对象
        var server=http.createServer(function(req,res){
            var data="";
            req.on("data",function(_data){
               data+=_data;
            });
            req.on("end",function(){
                // console.log(req.headers.abc);
                if(data.trim().length===0) data=req.url.split("?")[1];   
                else{
                    try{
                        data=JSON.parse(data);
                    }catch(error){
        
                    }
                }
                if(typeof data==="string"){
                    try{
                        data=querystring.parse(data);
                    }catch(error){
                        res.end("错误的消息");
                        return;
                    }
                }
                if(!data){
                    res.end("错误的消息");
                    return;
                }
                res.writeHead(200,{
                    "content-type":"text/html;charset=utf-8",
                    // "Access-Control-Allow-Headers":"*",//请求头跨域
                     "Access-Control-Allow-Origin":"*",
                    //  cors跨域
                    });
                    switch(req.url.split("?")[0]){   根据?前面的文件名,来进行判断
                        case "/a":
                            route.a(res,data);
                            break;
                        case "/b":
                            route.b(res,data);
                            break;
                    }
                   
            })
        });
        server.listen(4006);
    }
    module.exports=createServers;  //文件导出
    
    • 不同的接口返回不同数据的文件
      a.js //二级路由
    var obj={
        a:1,
        init:function(res,data){
            console.log("执行了a.js");
            res.write((data.user? data.user : "你没有user")+"欢迎光临");  //服务的返回数据
            res.end();
        }
    }
    module.exports=obj;//这个导出一个
    // exports.obj=obj;//这个可以导出多个
    

    b.js //二级路由

    var obj={
        a:1,
        init:function(res,data){
            console.log("执行了b.js");
            res.write((data.user? data.user : "你没有user")+"欢迎再次光临");
            res.end();
        }
    }
    module.exports=obj;  //导出
    

    index.js 一级路由,调用多个二级路由,作为入口文件

    var cs=require("./main");
    var route={
        a:require("./a").init,
        b:require("./b").init
    }
    cs(route);
    

    路由的作用:在vue中路由的定义是视图的切换,但是在node中,路由是为了控制服务的开启和对接口的更好调用(解耦),即使一个接口出现了问题,但是不会影响到其他的内容

    下面的是前端的模块化开发,采用AMD的方式,模仿commenJs的写法

    a.js 子文件

    define((function(){   //自执行函数
        var a=1;
        return {    
            b:2,
            init:function(){
                console.log(a);
                console.log(this.b);
            }
        }
    })());
    

    b.js 子文件

    define((function(){
        return {
            init:function(a,b){
                console.log(a+b);
            }
        }
    })());
    

    c.js 有依赖文件的导入

    define(["./Utils"],function(Utils){   //依赖文件的引入用[]来完成
       var div= Utils.ce("div",{
            "50px",
            height:"50px",
            backgroundColor:"red"
        });
        return div;
    });
    

    index.js 入口文件 唯一和HTML文件接触的js文件

    require(["./a","./b","./c"],function(obj,obj2,div){  //文件的引入使用[]来完成,后面的函数实参一一对应,对多个子文件进行统一管理
        obj.init();
        obj2.init(10,obj.b);
        document.body.appendChild(div);
    })
    

    前端的模块化开发有三种方式,一种是上面说的AMD模式,一种是CMD,还有一种最常用的是ES6的模块化开发

    CMD是同步的,不太符合前端编程,而AMD是异步的,所以多用这个,包括ES6的模块化开发,使用打包工具(webpace,gulp),最后都会转换成ES5的AMD模式

  • 相关阅读:
    ckeditor 配置
    vc6 winpcap
    (转)在PHP中使用Java的类库。
    aircrack deauth attack
    slitax 制定iso
    轻量级制定linux系统相关资料
    Android下Cocos2d创建HelloWorld工程
    Android下读取logcat的信息
    LoadRunner调用Oracle存储过程
    LoadRunner访问Mysql数据库
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13519569.html
Copyright © 2011-2022 走看看