NodeJs 初识 (一)

NodeJS

NodeJS 核心

概述:Node.js 是一个基于 Chrome v8 引擎的 js 运行环境。

Node API

Node 全局对象(global)

提供类似部分 webApi 的方法和其他属性:

  1. setTimeout

  2. setInterval

  3. setImmediate

  4. console

  5. __dirname 当前模块的目录名(看似是全局变量,实质是模块变量(module))

  6. __filename 当前模块文件名(同上) ———— 当前的模块文件的绝对路径

  7. Buffer 处理二进制数据的

    Buffer 类是 JavaScript 语言内置的 Uint8Array 类的子类 → 中文文档

  8. process 进程

    • process.arch 操作系统的 CPU 架构 (一般我们使用的电脑是 x32 / x64)

    • process.argv 获取命令中的所有参数

      // 如仅在 index.js 输出下面的属性
      console.log(process.argv);
      /**
      [
          'D:\\软件\\Node.js_setup\\node.exe',
          'e:\\FontEnd_File\\JavaScript\\NodeJS\\pro_demo\\index.js'
      ]
      */
      
    • process.env 返回环境变量对象

    • process.cwd() 返回 Node.js 进程的当前工作目录(绝对路径)

    • process.exit([code]) 退出状态 code 指示 Node.js 同步地终止进程(code 默认值为 0)

    • process.kill(pid[, signal]) 根据 pid 杀死进程 (pid 为进程 ID;signal 将发送的信号,默认值:‘SIGTERM’)

    • process.platform 获取当前的操作系统

Node模块化细节

模块的查找
  • 根据绝对路径直接加载模块
  • 根据相对路径(相对于当前模块)加载模块(以 ./../ 开头),内部也会转换为绝对路径来加载模块
  • 相对路径(没以 ./ 或 …/ 开头的模块)查找加载规则:
    ① 检查是否是内置模块,如 fs / path
    ② 检查当前目录中的 node_modules 目录下有没有
    ③ 检查上级目录中的 node_modules 目录
    ④ 找到则转换为绝对路径(否则报错,找不到这个模块)
    ⑤ 加载模块
  • 若不写后缀名,node 会自动补全(补全顺序为: js → json → node → mjs)
  • 若只提供目录而没有提供文件名,则自动在该目录下寻找 index.js (默认);若修改过 package.json 中的 main 字段,则根据此字段指定的文件加载
require函数
// 某模块 (a.js) 内代码为:
exports.c = 3;
module.exports = {
   
    a: 1,
    b: 2
}
this.m = 4;// 由另一模块 (b.js) 导入结果是什么?
const result = require('./a.js');
console.log(result); // ???

// 结果:
result = {
   
    a: 1,
    b: 2
}

上题结果来源需理解导入函数 require 内部实现, 如下所示:

// require函数大致处理流程(非其内部真正代码)
function require(modulePath){
   
    // 1. 将modulePath转换为绝对路径    './src' -> 'D:\code_file\NodeJS\Node_Modules\index.js'

    // 2. 判断该模块是否已有缓存(生成的绝对路径会作为缓存对象内部的键,值为模块代码)
    /**
    if(require.cache['D:\\code_file\\NodeJS\\Node_Modules\\index.js']){
        return require.cache['D:\\code_file\\NodeJS\\Node_Modules\\index.js'].result;
    }
    */

    // 3. 读取文件内容(没有缓存执行此步,否则直接拿缓存结果)

    // 4. 将读取的文件内容包裹到一个函数中
    /** 大致效果(伪代码)
    function __temp(module, exprots, require, __dirname, __filename){
        // 读取的文件内容(即拿到的代码)
    }
    */

   // 5. 创建module对象
   /**
    module.exports = {};
    const exports = module.exports;

    __temp.call(module.exports, module, exports, require, module.path, module.filename);
    // 这里绑定了 this === module.exports
    */
   return module.exports;
}

因而上题的理解过程为:

  1. 内部导出的 module.exports === exports;
  2. 新增 c 属性为 3, 即 module.exports = exports = this = { c: 3 };
  3. 对 module.exports 重新赋值为一个新对象 { a: 1, b: 2 }
  4. this 与 exports 均指向原来的对象
  5. require 函数返回的对象是: module.exports 即新对象
  6. 所以,b.js 导入 a.js 打印的结果就是 { a: 1, b: 2 }

Node中的ES模块化

目前,Node中的 ES 模块化仍然处于实践阶段

模块要么是 CommonJS,要么是 ES(一个文件中不能混用):

  1. 默认情况下,均是 CommonJS;
  2. ES 模块处理办法:
    • 单个文件使用 ES module,更改其文件名后缀为 .mjs
    • 全部使用 ES 模块化,在 package.json 文件中加入 "type": "module"

当使用 ES 模块化运行时,命令行必须加上 --experimental-modules 语句,如:

node --experimental-modules index.mjs

基本内置模块

OS

const os = require(‘os’);

  1. os.EOL 一行结束的分隔(换行)符(不同的操作系统,换行符不同,所以可以使用此常量)
  2. os.arch() 获取 cpu 的架构名(主要是 x64 / x32)
  3. os.cpus() 获取 cpu 核的信息(几核芯片)
  4. os.freemem() 获取当前空闲内存量(单位是字节)
  5. os.homedir() 获取当前用户的主目录的字符串路径
  6. os.hostname() 获取当前操作系统主机名
  7. os.tmpdir() 获取操作系统的默认临时文件目录
path

const path = require(‘path’);

  1. path.basename(path[, ext]) 法返回 path 的最后一部分,参数 path 中之前的路径内容将会被忽略
    path <string> 文件路径
    ext 可选文件扩展名
    如果 path 不是字符串、或给定了 ext 但不是字符串,则抛出 TypeError

  2. path.delimiter 提供平台特定的路径定界符

  3. path.dirname 返回 path 的目录名

    const path = require('path');
    console.log(path.dirname('asdas/sfdasf/fasf/a.js'));
    // 返回 "asdas/sfdasf/fasf"
    
  4. path.extname() 返回文件名后缀名

  5. path.join(fullpath) 拼接多个字符串为一个路径

    const path = require('path');
    const fullpath = path.join('a', 'b', '../', 'c.js');
    console.log(fullpath);
    // 输出:   a\c.js      (windows系统下)
    
  6. path.normalize() 规范化给定的 path,解析 ‘…’ 和 ‘.’ 片段

    path.normalize('C:\\temp\\\\foo\\bar\\..\\');
    // 返回: 'C:\\temp\\foo\\'
    
  7. path.relative(from, to) 根据当前工作目录返回 from 到 to 的相对路径

  8. path.resolve([…paths]) 将路径或路径片段的序列解析为绝对路径
    给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径

    // 当前工作目录是:E:\FontEnd_File\JavaScript\NodeJS\pro_demo
    console.log(path.resolve('wwwjooo', 'dashia/mnjj', './index'));
    // 返回: E:\FontEnd_File\JavaScript\NodeJS\pro_demo\wwwjooo\dashia\mnjj\index
    console.log(path.resolve('/foo/bar', './bax'));
    // 返回: e:\foo\bar\bax
    
  9. path.sep 提供平台特定的路径片段分隔符 (windows 系统返回 \)

url

URL图示

  1. 由 url 生成对象

    const URL = require('url');
    const url = new URL.URL('http://user:[email protected]:8080/p/a/t/h?query=name#hash');
    // 或者调用 URL.parse() 方法
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值