美文网首页
五、模块

五、模块

作者: 向上而活 | 来源:发表于2019-08-22 22:18 被阅读0次

    在node中,以模块为单位划分所有功能。并提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分。
    不可能用一个js文件去写全部的业务。肯定要有MVC。
    狭义的说,每一个 Javascript文件都是一个模块;而多个 Javascript文件之间可以相互 require,他们共同实现了一个功能,他们整体对外,又称为一个广义上的模块。

    Node中,一个 Javascript文件中定义的变量、函数,都只在这个文件内部有效,当需要从此JS文件外部引用这些变量、函数时,必须使用 exports对象进行暴露,使用者要用 requirel命令引用这个JS文件。

    //foo.js文件中的代码
    var msg="你好";
    exports.msg=msg;
    //使用者
    var foo=require("./test/foo.js")
    console.log(foo.msg);
    

    js文件中,可以用 exports暴露很多东西,比如函数、变量。

    var msg="你好”
    var info="呵呵”
    function showinfo(){
    console. log(info)
    }
    exports. msg=msg;
    exports. info=info;
    exports. showinfo=showinfo;
    

    Node中,js文件和js文件,就是被一个个 exports和 require构成为网状的。不是靠html文件统一在一起的。
    一个 Javascript文件,可以向外 exports无数个变量、函数。但是 require 的时候,仅仅需要 rcquire这个JS文件一次。使用它的变量、函数的时候,用点(.)语法即可,所以,无形中,增加了一个顶层命名空间。

    function People(name, sex, age){
    this.name =name;
    this.sex = sex;
    this.age = age;
    }
    People. prototype={
    sayhello: function(){
    console. log(this.name +this.sex +this.age);
    }
    }
    //此时, Peoplel就被视为构造函数,可以用new来实例化了
    module.exports =People;
    
    var People=require("./test/People.js");
    var xiaoming= new People("小明","nan","12");
    xiaoming. sayhello();
    

    可以将一个 Javascript文件中,描述一个类。用module.export=构造函数名 的方式向外暴露一个类。
    也就是说,js文件和js文件之间有两种合作的模式:
    1、某一个js文件中,提供了函数,供别人使用。只需要暴露函数就行了;
    exports. msg=msg
    2、某一个js文件,描述了一个类;
    module exports= People;

    如果在 require命令中,这么写:
    var foo= require(" foo. js");没有写./,所以不是一个相对路径。是一个特殊的路径,那么, Node. js将该文件视为 node_modules目录下的一个文件
    node_modules文件夹并不一定在同级目录里面,在任何直接祖先级目录中,都可以。
    甚至可以放到NODE_PATH环境变量的文件夹中。这样做的好处稍后你将知道:分享项目的时候,不需要带着 modules一起给别人。

    我们可以使用文件夹来管理模块,比如:
    var bar=require("bar");
    那么 Node将会去寻找 node_modules目录下的bar文件夹中的 index. js去执行。
    每一个模块文件夹中,推荐都写一个 package. json文件,这个文件的名字不能改。node将自动读取里面的配置。有一个main项,就是入口文件:
    {
    "name":"kaoladebar",
    "version":"1.0.1",
    "main":"app.js"
    }
    package. json文件,要放到模块文件夹的根目录去。

    模块就是一些功能的封装,所以一些成熟的、经常使用的功能,都有人封装成为了模块并且放到了社区中,供人免费下戟。这个伟大的社区,叫做npm。(npmjs.com
    )也是一个工具名字 node package management

    去社区搜素需求,然后点进去,看api。
    如果要配置一个模块,那么直接在cmd使用 npm install+模块名字 就可以安装。
    模块名字全球唯一。

    安装的时候,要注意,命令提示符的所在位置。

    注意:
    1.我们的依赖包,可能在随时更新,我们永远想保持更新,或者保持某一个版本;
    2.项目越来越大的时候,给别人看的时候,没有必要再次共享我们引用的第三方模块。

    在cmd中,使用 npm init可以初始化一个 package. json文件,用回答问题的方式生成一个新的 package文件。
    使用
    npm install
    将能安装所有依赖。
    npm也有文档,这是 package. json的介绍:npm文档

    require()别的js文件的时候,将执行那个js文件。

    注意:require()中的路径,是从当前这个js文件出发,找到别人。
    假如,桌面上有一个a.js与test文件夹,test文件夹中中有b.js、c.js、1.txt
    a要引用b:
    var b=require("./test/b.js")
    b要引用c:
    var b=require("./c.js")
    但是,fs等其他的模块用到路径的时候,都是相对于cmd命令光标所在位置。
    所以,在b.js中想读1.txt文件,推荐用绝对路径:
    fs.readFile(__ dirname+"1.txt",function(err,data).{
    if(err){
    throw err;
    }
    console. log( data.tostring())
    })

    自定义路由模块简单实例:

    //router_index,js
    
    var http=require("http");
    var router=require("./router1.js");//引用自定义路由模块 文件
    //创建服务器
    var server=http.createServer(function(req,res){
        res.writeHead(200,{'Content-Type':'text/html;charst=UTF8'});
        if(req.url=="/"){
            router.showIndex(req,res);
        }
        else if(req.url.substr(0,9)=="/student/"){
            router.showStudent(req,res);
        }
        else{
            router.show404(req,res)
            }
    })
    
    server.listen(80,"127.0.0.1");
    
    ///////////////////////router1.js 文件////////////////////////////////////////
    
    exports.showIndex=showIndex;
    exports.showStudent=showStudent;
    exports.show404=show404;
    
    function showIndex(req,res){
        res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
        res.end("我是首页")
    }
    function showStudent(req,res){
        res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
        res.end("我是学生页面")
    }
    function show404(req,res){
        res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
        res.end("404页面")
    }
    

    相关文章

      网友评论

          本文标题:五、模块

          本文链接:https://www.haomeiwen.com/subject/grtasctx.html