Node.js——全局对象和模块

全局对象和模块

1、全局对象

全局,即程序中任何地方都可以使用,Node.js内置了多个全局变量、全局对象和全局函数,在开发Node.js程序时都可以使用,下面分别对它们进行讲解。

1.1、全局变量

Node.js中的全局变量有两个,分别是__filename和__dirname,它们的说明如下。

  • __filename全局变量:__filename表示当前正在执行的脚本的文件名,包括文件所在位置的绝对路径,但该路径和命令行参数所指定的文件名不一定相同。如果在模块中,则返回的值是模块文件的路径。
  • __dirname全局变量:__dirname表示当前执行的脚本所在的目录。

例如,下面代码用来分别输出Node.js中两个全局变量的值:

js 复制代码
console.log('当前文件名:',__filename);
console.log('当前目录:',__dirname);
复制代码
当前文件名: /Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js
当前目录: /Users/acton_zhang/前端/vscodeworkspace/node/demo

1.2、全局对象

全局对象可以在Node.js程序的任何地方进行访问,它可以为程序提供经常使用的特定功能。Node.js中的全局对象如表所示。

  • console:提供控制台标准输入
  • process:描述当前程序状态
  • exports:Node.js模块系统中公开的接口
1.2.1、console

console对象的常见方法:

  • log():向标准输出流打印字符并以换行符结束,该方法可以接收若干个参数。如果只有一个参数,则输出这个参数的字符串形式;如果有多个参数,则以类似于C语言中printfO命令的格式输出。
  • time():开始计时
  • timeEnd():结束计时,并输入完成时间(从console.time()到console.timeEnd()之间所花费的时间)

console.log()方法:

在console.log()方法中,可以使用占位符输出变量(如数字变量、字符串变量和JSON变量等)​,常用的占位符如下所示:

  • %d:输出数字变量
  • %s:输出字符串变量
  • %j:输出JSON变量
js 复制代码
console.log('%d+%d=%d',273,52,273+52);
console.log('%d+%d=%d',273,52,273+52,52273);
console.log('%d+%d=%d & %d',273,52,273+52);

console.log('字符串 %s','hello world','和顺序无关');
console.log('JSON %j',{name:'Node.js'});
js 复制代码
273+52=325
273+52=325 52273
273+52=325 & %d
字符串 hello world 和顺序无关
JSON {"name":"Node.js"}

console.time()方法和console.timeEnd()方法:

console.time()方法和console.timeEnd()方法用来记录程序的执行时间段。console.time()方法用来开始计时,其参数只是起到标识的作用;console.timeEnd()方法用来结束计时,并输出程序运行所需的时间,它在显示结果时,会在标识参数后面自动添加以毫秒为单位的时间。例如,下面代码用来输出执行10的阶乘运算所需要的时间:

js 复制代码
//开始计时
console.time('test');
let output = 1;
for(let i = 1; i <= 10; i++) {
    output *= i;
}
console.log('Result:', output);
//结束计时,并输入程序执行时间
console.timeEnd('test');
复制代码
Result: 3628800
test: 10.32ms
1.2.2、process对象

process对象用于描述当前程序的状态,与console对象不同的是,process对象只在Node.js中存在,在JavaScript中并不存在该对象。process对象的常用属性及说明如表所示。

属性 说明
argv 返回一个数组,由命令行执行脚本时的各个参数组成
env 返回当前系统的环境变量
version 返回当前Node.js的版本
versions 返回当前Node.js的版本号以及依赖包
arch 返回当前CPU的架构,如arm或x64等
platform 返回当前运行程序所在的平台系统,如win32、linux等
ExecPath 返回执行当前脚本的Node二进制文件的绝对路径
execArgv 返回一个数组,成员是命令行下执行脚本时在Nod可执行文件与脚本文件之间的命令行参数
exitCode 进程退出时的代码,如果进程通过process.exitO退出,不需要指定退出码
config 一个包含用来编译当前Node执行文件的JavaScript配置选项的对象。它与运行./configure脚本生成的config.gypi文件相同
pid 当前进程的进程号
ppid 当前进程的父进程的进程号
title 进程名
arch 当前CPU的架构:arm、ia32或者x64
platform 运行程序所在的平台系统darwin、freebsd、linux、sunos或win32
mainModule require.main的备选方法。不同点是,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块
js 复制代码
console.log('- process.env:', process.env);
console.log('- process.version:', process.version);
console.log('- process.versions:', process.versions);
console.log('- process.arch:', process.arch);
console.log('- process.platform:', process.platform);
console.log('- process.connected:', process.connected);
console.log('- process.execArgv:', process.execArgv);
console.log('- process.exitCode:', process.exitCode);
console.log('- process.mainModule:', process.mainModule);
console.log('- process.release:', process.release);
console.log('- process.memoryUsage():', process.memoryUsage());
console.log('- process.uptime():', process.uptime());
json 复制代码
- process.env: {
  MallocNanoZone: '0',
  USER: 'acton_zhang',
  COMMAND_MODE: 'unix2003',
  __CFBundleIdentifier: 'com.microsoft.VSCode',
  PATH: '/Users/acton_zhang/.nvm/versions/node/v18.19.0/bin:/usr/local/ffmpeg/bin:/usr/local/opt/libpq/bin:/Users/acton_zhang/.nvm/versions/node/v13.14.0/bin:/usr/local/opt/make/libexec/gnubin:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin:/usr/local/bin:/usr/local/sbin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/usr/local/go/bin:/usr/local/ffmpeg/bin:/usr/local/opt/libpq/bin:/Users/acton_zhang/.nvm/versions/node/v13.14.0/bin:/usr/local/opt/make/libexec/gnubin:.:/Users/acton_zhang/software/apache-maven-3.6.3/bin:/usr/local/mysql/bin:/usr/local/mysql/support-files:/Users/acton_zhang/software/elasticsearch-5.6.8/bin:/Users/acton_zhang/software/kibana-5.6.8-darwin-x86_64/bin:/Users/acton_zhang/software/gradle-4.6/bin:/Users/acton_zhang/software/android-sdk-macosx/platform-tools:/Users/acton_zhang/software/android-sdk-macosx/tools:/Users/acton_zhang/software/android-sdk-macosx/build-tools/29.0.3:/Users/acton_zhang/go:/Users/acton_zhang/go/bin:/usr/local/mongodb-macos-x86_64-5.0.17/bin:.:/Users/acton_zhang/software/apache-maven-3.6.3/bin:/usr/local/mysql/bin:/usr/local/mysql/support-files:/Users/acton_zhang/software/elasticsearch-5.6.8/bin:/Users/acton_zhang/software/kibana-5.6.8-darwin-x86_64/bin:/Users/acton_zhang/software/gradle-4.6/bin:/Users/acton_zhang/software/android-sdk-macosx/platform-tools:/Users/acton_zhang/software/android-sdk-macosx/tools:/Users/acton_zhang/software/android-sdk-macosx/build-tools/29.0.3:/Users/acton_zhang/go:/Users/acton_zhang/go/bin:/usr/local/mongodb-macos-x86_64-5.0.17/bin:/usr/local/ffmpeg/bin',
  LOGNAME: 'acton_zhang',
  SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.wtcWCQjyBV/Listeners',
  HOME: '/Users/acton_zhang',
  SHELL: '/bin/zsh',
  TMPDIR: '/var/folders/rj/bq21mr9s5d1cfth4zzt4ndj00000gn/T/',
  __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34',
  XPC_SERVICE_NAME: '0',
  XPC_FLAGS: '0x0',
  SHLVL: '1',
  PWD: '/Users/acton_zhang/前端/vscodeworkspace/node/demo',
  OLDPWD: '/Users/acton_zhang/前端/vscodeworkspace/node/demo',
  HOMEBREW_PIP_INDEX_URL: 'https://mirrors.cloud.tencent.com/pypi/simple',
  HOMEBREW_API_DOMAIN: 'https://mirrors.cloud.tencent.com/homebrew-bottles/api',
  HOMEBREW_BOTTLE_DOMAIN: 'https://mirrors.ustc.edu.cn/homebrew-bottles',
  HOMEBREW_PREFIX: '/usr/local',
  HOMEBREW_CELLAR: '/usr/local/Cellar',
  HOMEBREW_REPOSITORY: '/usr/local/Homebrew',
  INFOPATH: '/usr/local/share/info:/usr/local/share/info:',
  ZSH: '/Users/acton_zhang/.oh-my-zsh',
  PAGER: 'less',
  LESS: '-R',
  LSCOLORS: 'Gxfxcxdxbxegedabagacad',
  LS_COLORS: 'di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43',
  JAVA_8_HOME: '/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home',
  JAVA_7_HOME: '/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home',
  JAVA_9_HOME: '/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home',
  JAVA_17_HOME: '/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home',
  JAVA_HOME: '/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home',
  CLASSPATH: '/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:.',
  M2_HOME: '/Users/acton_zhang/software/apache-maven-3.6.3',
  GRADLE_HOME: '/Users/acton_zhang/software/gradle-4.6',
  ANDROID_HOME: '/Users/acton_zhang/software/android-sdk-macosx',
  ANDROID_SDK_HOME: '/Users/acton_zhang/software/android-sdk-macosx/android_sdk',
  GOPATH: '/Users/acton_zhang/go',
  NVM_DIR: '/Users/acton_zhang/.nvm',
  NVM_CD_FLAGS: '-q',
  NVM_BIN: '/Users/acton_zhang/.nvm/versions/node/v18.19.0/bin',
  NVM_INC: '/Users/acton_zhang/.nvm/versions/node/v18.19.0/include/node',
  TERM_PROGRAM: 'vscode',
  TERM_PROGRAM_VERSION: '1.112.0',
  LANG: 'zh_CN.UTF-8',
  COLORTERM: 'truecolor',
  GIT_ASKPASS: '/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh',
  VSCODE_GIT_ASKPASS_NODE: '/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin)',
  VSCODE_GIT_ASKPASS_EXTRA_ARGS: '',
  VSCODE_GIT_ASKPASS_MAIN: '/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js',
  VSCODE_GIT_IPC_HANDLE: '/var/folders/rj/bq21mr9s5d1cfth4zzt4ndj00000gn/T/vscode-git-af9945a908.sock',
  VSCODE_INJECTION: '1',
  ZDOTDIR: '/Users/acton_zhang',
  USER_ZDOTDIR: '/Users/acton_zhang',
  TERM: 'xterm-256color',
  VSCODE_PROFILE_INITIALIZED: '1',
  VSCODE_PYTHON_AUTOACTIVATE_GUARD: '1',
  _: '/Users/acton_zhang/.nvm/versions/node/v18.19.0/bin/node'
}
- process.version: v18.19.0
- process.versions: {
  node: '18.19.0',
  acorn: '8.10.0',
  ada: '2.7.2',
  ares: '1.20.1',
  base64: '0.5.0',
  brotli: '1.0.9',
  cjs_module_lexer: '1.2.2',
  cldr: '43.1',
  icu: '73.2',
  llhttp: '6.0.11',
  modules: '108',
  napi: '9',
  nghttp2: '1.57.0',
  nghttp3: '0.7.0',
  ngtcp2: '0.8.1',
  openssl: '3.0.12+quic',
  simdutf: '3.2.18',
  tz: '2023c',
  undici: '5.26.4',
  unicode: '15.0',
  uv: '1.44.2',
  uvwasi: '0.0.19',
  v8: '10.2.154.26-node.28',
  zlib: '1.2.13.1-motley'
}
- process.arch: x64
- process.platform: darwin
- process.connected: undefined
- process.execArgv: []
- process.exitCode: undefined
- process.mainModule: {
  id: '.',
  path: '/Users/acton_zhang/前端/vscodeworkspace/node/demo',
  exports: {},
  filename: '/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js',
  loaded: false,
  children: [],
  paths: [
    '/Users/acton_zhang/前端/vscodeworkspace/node/demo/node_modules',
    '/Users/acton_zhang/前端/vscodeworkspace/node/node_modules',
    '/Users/acton_zhang/前端/vscodeworkspace/node_modules',
    '/Users/acton_zhang/前端/node_modules',
    '/Users/acton_zhang/node_modules',
    '/Users/node_modules',
    '/node_modules'
  ]
}
- process.release: {
  name: 'node',
  lts: 'Hydrogen',
  sourceUrl: 'https://nodejs.org/download/release/v18.19.0/node-v18.19.0.tar.gz',
  headersUrl: 'https://nodejs.org/download/release/v18.19.0/node-v18.19.0-headers.tar.gz'
}
- process.memoryUsage(): {
  rss: 31256576,
  heapTotal: 4816896,
  heapUsed: 4168544,
  external: 286652,
  arrayBuffers: 11182
}
- process.uptime(): 0.040933622

1.3、全局函数

全局函数,即可以在程序的任何地方调用的函数,Node.js主要提供了6个全局函数,其说明如下:

函数 说明
setTimeout(cb,ms) 添加一个定时器,在指定的毫秒(ms)数后执行指定函数(cb)
clearTimeout(t) 取消定时器,停止一个之前调用setTimeoutO)创建的定时器
setInterval(cb,ms) 添加一个定时器,每隔一定的时间(ms)就执行一次函数(cb)
clearInterval(t) 取消定时器,停止之前调用setInterval()创建的定时器
setImmediate(callback[,...args]) 安排在I/O事件的回调之后立即执行的callback
clearImmediate(immediate) 取消由setImmediate()创建的Immediate对象

setTimeout(cb,ms)和clearTimeout(t)

这两个全局函数分别用来设置和取消一个定时器,此处需要说明的是,setTimeout(cb,ms)设置的定时器仅调用一次指定的方法。示例代码如下:

js 复制代码
let timer = setTimeout(()=>{
    console.log("将在2秒后看到这句话");
}, 2000);
// clearTimeout(timer);

运行上面代码,2秒后将会显示如下内容:

js 复制代码
您将在2秒后看到这句话

如果将上面代码中的最后一行取消注释,则运行程序时不会输出任何内容,因为虽然前3行代码添加了一个定时器,但是第4行又取消了该定时器,所以在控制台不会输出内容。

setInterval(cb,ms)和clearInterval(t)

这两个全局函数分别用来添加和取消一个定时器。其中参数cb为要执行的函数;ms为调用cb函数前等待的时间;t表示要取消的setInterval()方法设置的定时器。使用setInterval()方法设置定时器与使用setTimeout()方法设置定时器的区别是,使用setInterval()方法设置的定时器可以多次调用指定的方法,而使用setTimeout()方法设置的定时器只能调用一次指定的方法。示例代码如下:

js 复制代码
let i = 0;
let timer = setInterval(()=>{
    i += 1;
    console.log("已执行" + i + "次");
    if(i >= 5){
        //执行5次后,取消定时器
        clearInterval(timer);
        console.log("执行完毕"); 
    }
}, 2000);

运行上面的代码,每隔2秒会显示一次执行函数的次数,直到执行5次以后,取消定时器,最终输出结果如下:

js 复制代码
已执行1次
已执行2次
已执行3次
已执行4次
已执行5次
执行完毕

setImmediate(callback[,...args])和clearImmediate(immediate)

这两个全局函数用来安排在I/O事件的回调之后立即执行的函数,以及取消setImmediate()创建的Immediate对象。其中,callback参数指的是要执行的函数,immediate参数表示使用setImmediate()创建的Immediate对象。

I/O(input/output)即输入/输出,通常指数据在内部存储器与外部存储器或其他周边设备之间的输入和输出。示例代码如下:

js 复制代码
console.log("正常执行1");
var a = setImmediate(function () {
     console.log("我被延迟执行了");
});
console.log("正常执行2")
//clearImmediate(a)

上面代码的运行结果如下:

js 复制代码
正常执行1
正常执行2
我被延迟执行了

如果将最后一行代码取消注释,则运行结果如下:

复制代码
正常执行1
正常执行2

2、模块化编程

Node.js主要使用模块系统进行编程,所谓模块,是指为了方便调用功能,预先将相关方法和属性封装在一起的集合体。模块和文件是一一对应的,即一个Node.js文件就是一个模块,这个文件可以是JavaScript代码、JSON或者编译过的C/C++扩展等。下面对Node.js模板化编程中

2.1、exports对象

在Node.js中创建模块需要使用exports对象,该对象可以共享方法、变量、构造和类等,下面通过一个实例讲解如何使用exports创建一个模块。

使用exports对象实现模块化编程。

  1. 创建一个module.js文件,其中通过exports对象共享求绝对值和计算圆面积的方法,代码如下:
js 复制代码
//求绝对值的方法abs
exports.abs = (number)=>{
    if(0 < number) {
        return number;
    } else {
        return -number;
    }
}

//求圆面积的方法circleArea
exports.circleArea = (radius)=>{
    return radius * radius * Math.PI;
}
  1. 创建一个main.js文件,用来调用前面创建的模块来计算指定值的绝对值及指定半径的圆面积,代码如下:
js 复制代码
//加载module.js模块文件
let mathUtils = require('./module.js');
//使用模块方法
console.log('abs(-273) = %d', mathUtils.abs(-273));
console.log('circleArea(3) = %d', mathUtils.circleArea(3));

上面代码中,通过使用require()导入了创建的module.js模块文件。运行main.js文件,结果如下:

复制代码
abs(-273) = 273
circleArea(3) = 28.274333882308138

2.2、module对象

在Node.js中,除了使用exports对象进行模块化编程,还可以使用module对象进行模块化编程。module对象的常用属性如表所示。

属性 说明
id 模块的标识符,通常是完全解析后的文件名,默认输出
path Node.js运行js模块所在的文件路径
exports 公开的内容,也就是导出的对象,引入该模块会得到这个对象
filename 当前模块文件名,包含路径
loaded 模块是否加载完毕
parent 当前模块的父模块对象
children 当前模块的所有子模块对象

使用module对象实现模块化编程。

  1. 创建一个module.js文件,其中定义一个输出方法,然后通过module对象的exports属性指定对外接口,代码如下:
js 复制代码
function hello(){
    let name;
    this.setName = function(thyName){
        name = thyName;
    };
    this.sayHello = function(){
        console.log(name + ',你好');
    };
}
module.exports = hello;
  1. 创建一个main.js文件,用来调用创建的模块以输出内容,代码如下:
js 复制代码
let Hello = require('./module.js');
hello = new Hello();
hello.setName('2000');
hello.sayHello();

运行main.js文件,结果如下:

js 复制代码
2000,你好

与使用exports对象相比,唯一的变化是使用module.exports = Hello代替了exports。在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports。

相关推荐
fxshy2 小时前
前端直连模型 vs 完整 MCP:大模型驱动地图的原理与实践(技术栈Vue + Cesium + Node.js + WebSocket + MCP)
前端·vue.js·node.js·cesium·mcp
2501_921649492 小时前
WebSocket 金融实时行情推送 API 实战解析:低延迟、高可用架构设计与落地
websocket·网络协议·金融·node.js
hljqwb2 小时前
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
node.js
吴声子夜歌2 小时前
Node.js——事件的监听与触发
node.js
面包爱阜阳2 小时前
使用 GitHub 和 Vercel 部署个人网站
node.js·github
getapi3 小时前
Mac mini M4 安装 Node.js 22 教程
macos·node.js
吴声子夜歌3 小时前
Node.js——os操作系统模块
开发语言·node.js·php
百万蹄蹄向前冲12 小时前
让TypeScript 再次伟大:愚人节前夜Claude Code意外开源与OpenClaw小龙虾打造 AI 原生开发新纪元
人工智能·typescript·node.js
gCode Teacher 格码致知17 小时前
Javascript提高:get和post等请求,对于汉字和空格信息进行编码的原则-由Deepseek产生
开发语言·前端·javascript·node.js·jquery