zoukankan      html  css  js  c++  java
  • nodejs-模块系统

    Node.js模块系统
    
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
    
    模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
    
    
    
    //-------------------------------------
    
    hello.js
    
    
    
    exports.world = function() {
    
      console.log('Hello World');
    
    }
    
    
    
    main.js
    
    var hello = require('./hello');
    
    hello.world();
    
    
    
    
    
    对象封装到模块中
    
    //hello.js
    
    function Hello() {
    
        var name;
    
        this.setName = function(thyName) {
    
            name = thyName;
    
        };
    
        this.sayHello = function() {
    
            console.log('Hello ' + name);
    
        };
    
    };
    
    module.exports = Hello;
    
    
    
    //main.js
    
    var Hello = require('./hello');
    
    hello = new Hello();
    
    hello.setName('BYVoid');
    
    hello.sayHello();
    
    
    
    //-----------------------------------
    
    
    
    

    调用查找顺序

     

    在路径 Y 下执行 require(X) 语句执行顺序
    
    1. 如果 X 是内置模块
    
       a. 返回内置模块
    
       b. 停止执行
    
    2. 如果 X 以 '/' 开头
    
       a. 设置 Y 为文件根路径
    
    3. 如果 X 以 './' 或 '/' or '../' 开头
    
       a. LOAD_AS_FILE(Y + X)
    
       b. LOAD_AS_DIRECTORY(Y + X)
    
    4. LOAD_NODE_MODULES(X, dirname(Y))
    
    5. 抛出异常 "not found"
    
    
    
    LOAD_AS_FILE(X)
    
    1. 如果 X 是一个文件, 将 X 作为 JavaScript 文本载入并停止执行。
    
    2. 如果 X.js 是一个文件, 将 X.js 作为 JavaScript 文本载入并停止执行。
    
    3. 如果 X.json 是一个文件, 解析 X.json 为 JavaScript 对象并停止执行。
    
    4. 如果 X.node 是一个文件, 将 X.node 作为二进制插件载入并停止执行。
    
    
    
    LOAD_INDEX(X)
    
    1. 如果 X/index.js 是一个文件,  将 X/index.js 作为 JavaScript 文本载入并停止执行。
    
    2. 如果 X/index.json 是一个文件, 解析 X/index.json 为 JavaScript 对象并停止执行。
    
    3. 如果 X/index.node 是一个文件,  将 X/index.node 作为二进制插件载入并停止执行。
    
    
    
    LOAD_AS_DIRECTORY(X)
    
    1. 如果 X/package.json 是一个文件,
    
       a. 解析 X/package.json, 并查找 "main" 字段。
    
       b. let M = X + (json main 字段)
    
       c. LOAD_AS_FILE(M)
    
       d. LOAD_INDEX(M)
    
    2. LOAD_INDEX(X)
    
    
    
    LOAD_NODE_MODULES(X, START)
    
    1. let DIRS=NODE_MODULES_PATHS(START)
    
    2. for each DIR in DIRS:
    
       a. LOAD_AS_FILE(DIR/X)
    
       b. LOAD_AS_DIRECTORY(DIR/X)
    
    
    
    NODE_MODULES_PATHS(START)
    
    1. let PARTS = path split(START)
    
    2. let I = count of PARTS - 1
    
    3. let DIRS = []
    
    4. while I >= 0,
    
       a. if PARTS[I] = "node_modules" CONTINUE
    
       b. DIR = path join(PARTS[0 .. I] + "node_modules")
    
       c. DIRS = DIRS + DIR
    
       d. let I = I - 1
    
    5. return DIRS

     

  • 相关阅读:
    自定义行操作事件——DataGrid系列
    分页样式——DataGrid系列
    勾选批量操作——DataGrid系列
    快速排序的基本实现
    2021/06--09学习情况一些总结和反思
    IntegerCache的一些联想
    Hibernate, Jpa, Spring Data Jpa的关系与区别
    Springboot+Hibernate+Transactional中save提交引发的db异常无法捕获
    一个涉及多系统多步骤的业务需求设计与思考
    Use SQL to query dataverse
  • 原文地址:https://www.cnblogs.com/csnd/p/12061863.html
Copyright © 2011-2022 走看看