1. 程式人生 > 實用技巧 >js中的模組化開發(前端、後端)

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",{
        width:"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模式