Node.js

作者: 小蝴蝶_037a | 来源:发表于2020-10-26 11:31 被阅读0次

    module
    通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。

    module.exports = function () {
        console.log('Hello World!');
    };
    

    以上代码中,模块默认导出对象被替换为一个函数。

    模块初始化

    一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。
    完整示例
    例如有以下目录。

    • /home/user/hello/
    - util/
        counter.js
    main.js
    

    其中counter.js内容如下:

    var i = 0;
    
    function count() {
        return ++i;
    }
    
    exports.count = count;
    

    该模块内部定义了一个私有变量i,并在exports对象导出了一个公有方法count。

    主模块main.js内容如下:

    
    var counter1 = require('./util/counter');
    var    counter2 = require('./util/counter');
    
    console.log(counter1.count());
    console.log(counter2.count());
    console.log(counter2.count());
    

    运行该程序的结果如下:

    $ node main.js

    1
    2
    3
    

    可以看到,counter.js并没有因为被require了两次而初始化两次。

    小结

    有关NodeJS的基本概念和使用方法,总结起来有以下知识点:

    • NodeJS是一个JS脚本解析器,任何操作系统下安装NodeJS本质上做的事情都是把NodeJS执行程序复制到一个目录,然后保证这个目录在系统PATH环境变量下,以便终端下可以使用node命令。

    • 终端下直接输入node命令可进入命令交互模式,很适合用来测试一些JS代码片段,比如正则表达式。

    • NodeJS使用CMD模块系统,主模块作为程序入口点,所有模块在执行过程中只初始化一次。

    • 除非JS模块不能满足需求,否则不要轻易使用二进制模块,否则你的用户会叫苦连天。

    模块路径解析规则

    内置模块

    如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require('fs')。

    node_modules目录

    NodeJS定义了一个特殊的node_modules目录用于存放模块。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require('foo/bar')方式加载模块时,则NodeJS依次尝试使用以下路径。

     /home/user/node_modules/foo/bar
     /home/node_modules/foo/bar
     /node_modules/foo/bar
    

    NODE_PATH环境变量

    与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:分隔,在Windows下使用;分隔。例如定义了以下NODE_PATH环境变量:

    NODE_PATH=/home/user/lib:/home/lib
    当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径。

     /home/user/lib/foo/bar
     /home/lib/foo/bar
    

    包(package)

    package.json

    如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。上例中的cat模块可以重构如下。

    - /home/user/lib/
        - cat/
            + doc/
            - lib/
                head.js
                body.js
                main.js
            + tests/
            package.json
    

    其中package.json内容如下。

    {
        "name": "cat",
        "main": "./lib/main.js"
    }
    

    如此一来,就同样可以使用require('/home/user/lib/cat')的方式加载模块。NodeJS会根据包目录下的package.json找到入口模块所在位置。

    工程目录

    了解了以上知识后,现在我们可以来完整地规划一个工程目录了。以编写一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。

    - /home/user/workspace/node-echo/   # 工程目录
        - bin/                          # 存放命令行相关代码
            node-echo
        + doc/                          # 存放文档
        - lib/                          # 存放API相关代码
            echo.js
        - node_modules/                 # 存放三方包
            + argv/
        + tests/                        # 存放测试用例
        package.json                    # 元数据文件
        README.md                       # 说明文件
    

    NPM

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

    允许用户从NPM服务器下载别人编写的三方包到本地使用。
    允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
    允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

    可以看到,NPM建立了一个NodeJS生态圈,NodeJS开发者和用户可以在里边互通有无。以下分别介绍这三种场景下怎样使用NPM。

    相关文章

      网友评论

          本文标题:Node.js

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