Node.js 進(jìn)程

2022-02-26 10:32 更新

進(jìn)程

本節(jié)介紹Node.js的process(過程)對(duì)象,它提供有關(guān)當(dāng)前Node.js過程的信息和控制。

process是全局對(duì)象,能夠在任意位置對(duì)其進(jìn)行訪問,而無需使用require(),是EventEmitter的實(shí)例。

退出狀態(tài)碼

當(dāng)不需要處理新的異步的操作時(shí),Node正常情況下退出時(shí)會(huì)返回狀態(tài)碼0。下面提供了一些表示其他狀態(tài)的狀態(tài)碼:

  • 1未捕獲的致命異常-Uncaught Fatal Exception - 有未捕獲異常,并且沒有被域或 uncaughtException 處理函數(shù)處理。
  • 2- Unused (保留)
  • 3JavaScript解析錯(cuò)誤-Internal JavaScript Parse Error - JavaScript的源碼啟動(dòng) Node 進(jìn)程時(shí)引起解析錯(cuò)誤。非常罕見,僅會(huì)在開發(fā)Node時(shí)才會(huì)有。
  • 4JavaScript評(píng)估失敗-Internal JavaScript Evaluation Failure - JavaScript的源碼啟動(dòng)Node進(jìn)程,評(píng)估時(shí)返回函數(shù)失敗。非常罕見,僅會(huì)在開發(fā) Node時(shí)才會(huì)有。
  • 5致命錯(cuò)誤-Fatal Error - V8里致命的不可恢復(fù)的錯(cuò)誤。通常會(huì)打印到stderr,內(nèi)容為:FATAL ERROR
  • 6Non-function異常處理-Non-function Internal Exception Handler - 未捕獲異常,內(nèi)部異常處理函數(shù)不知為何設(shè)置為on-function,并且不能被調(diào)用。
  • 7異常處理函數(shù)運(yùn)行時(shí)失敗-Internal Exception Handler Run-Time Failure - 未捕獲的異常, 并且異常處理函數(shù)處理時(shí)自己拋出了異常。例如,如果 process.on('uncaughtException')domain.on('error')拋出了異常。
  • 8- Unused保留。 之前版本的Node, 狀態(tài)碼8有時(shí)表示未捕獲異常。
  • 9- 參數(shù)非法-Invalid Argument - 可能是給了未知的參數(shù),或者給的參數(shù)沒有值。
  • 10運(yùn)行時(shí)失敗-Internal JavaScript Run-Time Failure - JavaScript的源碼啟動(dòng) Node 進(jìn)程時(shí)拋出錯(cuò)誤,非常罕見,僅會(huì)在開發(fā) Node 時(shí)才會(huì)有。
  • 12無效的Debug參數(shù)-Invalid Debug Argument - 設(shè)置了參數(shù)--debug--debug-brk,但是選擇了錯(cuò)誤端口。
  • >128信號(hào)退出-Signal Exits - 如果Node接收到致命信號(hào),比如SIGKILLSIGHUP,那么退出代碼就是128加信號(hào)代碼。這是標(biāo)準(zhǔn)的Unix做法,退出信號(hào)代碼放在高位。

事件: 'exit'

當(dāng)進(jìn)程準(zhǔn)備退出時(shí)觸發(fā)。此時(shí)已經(jīng)沒有辦法阻止從事件循環(huán)中推出。因此,你必須在處理函數(shù)中執(zhí)行同步操作。這是一個(gè)在固定事件檢查模塊狀態(tài)(比如單元測(cè)試)的好時(shí)機(jī)?;卣{(diào)函數(shù)有一個(gè)參數(shù),它是進(jìn)程的退出代碼。

監(jiān)聽exit事件的例子:

process.on('exit', function(code) {
  // do *NOT* do this
  setTimeout(function() {
    console.log('This will not run');
  }, 0);
  console.log('About to exit with code:', code);
});

事件: 'beforeExit'

當(dāng)node清空事件循環(huán),并且沒有其他安排時(shí)觸發(fā)這個(gè)事件。通常來說,當(dāng)沒有進(jìn)程安排時(shí)node退出,但是'beforeExit'的監(jiān)聽器可以異步調(diào)用,這樣node就會(huì)繼續(xù)執(zhí)行。

'beforeExit'并不是明確退出的條件,process.exit()或異常捕獲才是,所以不要把它當(dāng)做'exit'事件。除非你想安排更多的工作。

事件: 'uncaughtException'

當(dāng)一個(gè)異常冒泡回到事件循環(huán),觸發(fā)這個(gè)事件。如果給異常添加了監(jiān)視器,默認(rèn)的操作(打印堆棧跟蹤信息并退出)就不會(huì)發(fā)生。

監(jiān)聽uncaughtException的例子:

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});

setTimeout(function() {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

注意:uncaughtException是非常簡(jiǎn)略的異常處理機(jī)制。

盡量不要使用它,而應(yīng)該用domains 。如果你用了,每次未處理異常后,重啟你的程序。

不要使用node.js里諸如On Error Resume Next這樣操作。每個(gè)未處理的異常意味著你的程序,和你的node.js擴(kuò)展程序,一個(gè)未知狀態(tài)。盲目的恢復(fù)意味著任何事情都可能發(fā)生

你在升級(jí)的系統(tǒng)時(shí)拉掉了電源線,然后恢復(fù)了??赡?0次里有9次沒有問題,但是第10次,你的系統(tǒng)可能就會(huì)掛掉。

Signal 事件

當(dāng)進(jìn)程接收到信號(hào)時(shí)就觸發(fā)。信號(hào)列表詳見標(biāo)準(zhǔn)的POSIX信號(hào)名,如SIGINT、SIGUSR1等。

監(jiān)聽SIGINT的例子:

// Start reading from stdin so we don't exit.
process.stdin.resume();

process.on('SIGINT', function() {
  console.log('Got SIGINT.  Press Control-D to exit.');
});

在大多數(shù)終端程序里,發(fā)送SIGINT信號(hào)的簡(jiǎn)單方法是按下信號(hào)Control-C。

注意:

  • SIGUSR1node.js 接收這個(gè)信號(hào)開啟調(diào)試模式。可以安裝一個(gè)監(jiān)聽器,但開始時(shí)不會(huì)中斷調(diào)試。
  • SIGTERMSIGINT在非Windows系統(tǒng)里,有默認(rèn)的處理函數(shù),退出(伴隨退出代碼128 + 信號(hào)碼)前,重置退出模式。如果這些信號(hào)有監(jiān)視器,默認(rèn)的行為將會(huì)被移除。
  • SIGPIPE默認(rèn)情況下忽略,可以加監(jiān)聽器。
  • SIGHUP當(dāng)Windowns控制臺(tái)關(guān)閉的時(shí)候生成,其他平臺(tái)的類似條件,參見signal(7)??梢蕴砑颖O(jiān)聽者,Windows平臺(tái)上10秒后會(huì)無條件退出。在非Windows平臺(tái)上,SIGHUP的默認(rèn)操作是終止node,但是一旦添加了監(jiān)聽器,默認(rèn)動(dòng)作將會(huì)被移除。
  • SIGTERMWindows不支持,可以被監(jiān)聽。
  • SIGINT所有的終端都支持,通常由CTRL+C生成(可能需要配置)。當(dāng)終端原始模式啟用后不會(huì)再生成。
  • SIGBREAKWindows里,按下CTRL+BREAK會(huì)發(fā)送。非Windows平臺(tái),可以被監(jiān)聽,但是不能發(fā)送或生成。
  • SIGWINCH- 當(dāng)控制臺(tái)被重設(shè)大小時(shí)發(fā)送。Windows系統(tǒng)里,僅會(huì)在控制臺(tái)上輸入內(nèi)容時(shí),光標(biāo)移動(dòng),或者可讀的tty在原始模式上使用。
  • SIGKILL不能有監(jiān)視器,在所有平臺(tái)上無條件關(guān)閉node。
  • SIGSTOP不能有監(jiān)視器。

Windows不支持發(fā)送信號(hào),但是node提供了很多process.kill()child_process.kill()的模擬:

  • 發(fā)送Sending信號(hào)0可以查找運(yùn)行中得進(jìn)程
  • 發(fā)送SIGINTSIGTERMSIGKILL會(huì)引起目標(biāo)進(jìn)程無條件退出。

process.stdout

一個(gè)Writable Stream執(zhí)向stdout(fd1).

例如:console.log的定義:

console.log = function(d) {
  process.stdout.write(d + '\n');
};

process.stderrprocess.stdout和 node 里的其他流不同,他們不會(huì)被關(guān)閉(end()將會(huì)被拋出),它們不會(huì)觸發(fā)finish事件,并且寫是阻塞的。

  • 引用指向常規(guī)文件或TTY文件描述符時(shí),是阻塞的。
  • 引用指向pipe管道時(shí):
    • 在Linux/Unix里阻塞.
    • 在Windows像其他流一樣,不被阻塞

檢查Node是否運(yùn)行在TTY上下文中,從process.stderr,process.stdoutprocess.stdin里讀取isTTY屬性。

$ node -p "Boolean(process.stdin.isTTY)"
true
$ echo "foo" | node -p "Boolean(process.stdin.isTTY)"
false

$ node -p "Boolean(process.stdout.isTTY)"
true
$ node -p "Boolean(process.stdout.isTTY)" | cat
false

更多信息參見the tty docs。

process.stderr

一個(gè)指向stderr (fd2)的可寫流。

process.stderrprocess.stdout和node里的其他流不同,他們不會(huì)被關(guān)閉(end()將會(huì)被拋出),它們不會(huì)觸發(fā)finish事件,并且寫是阻塞的。

  • 引用指向常規(guī)文件或TTY文件描述符時(shí),是阻塞的。
  • 引用指向pipe管道時(shí):
    • 在Linux/Unix里阻塞
    • 在Windows像其他流一樣,不被阻塞

process.stdin

一個(gè)指向stdin (fd0)的可讀流。

以下例子:打開標(biāo)準(zhǔn)輸入流,并監(jiān)聽兩個(gè)事件:

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write('data: ' + chunk);
  }
});

process.stdin.on('end', function() {
  process.stdout.write('end');
});

process.stdin可以工作在老模式里,和v0.10之前版本的node代碼兼容。

更多信息參見Stream compatibility.

在老的流模式里,stdin流默認(rèn)暫停,必須調(diào)用process.stdin.resume()讀取??梢哉{(diào)用process.stdin.resume()切換到老的模式。

如果開始一個(gè)新的工程,最好選擇新的流,而不是用老的流。

process.argv

包含命令行參數(shù)的數(shù)組。第一個(gè)元素是'node',第二個(gè)參數(shù)是JavaScript文件的名字,第三個(gè)參數(shù)是任意的命令行參數(shù)。

// print process.argv
process.argv.forEach(function(val, index, array) {
  console.log(index + ': ' + val);
});

將會(huì)生成:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four

process.execPath

開啟當(dāng)前進(jìn)程的執(zhí)行文件的絕對(duì)路徑。

例子:

/usr/local/bin/node

process.execArgv

啟動(dòng)進(jìn)程所需的 node 命令行參數(shù)。這些參數(shù)不會(huì)在process.argv里出現(xiàn),并且不包含node執(zhí)行文件的名字,或者任何在名字之后的參數(shù)。這些用來生成子進(jìn)程,使之擁有和父進(jìn)程有相同的參數(shù)。

例子:

$ node --harmony script.js --version

process.execArgv 的參數(shù):

['--harmony']

process.argv 的參數(shù):

['/usr/local/bin/node', 'script.js', '--version']

process.abort()

這將導(dǎo)致node觸發(fā)abort事件。會(huì)讓node退出并生成一個(gè)核心文件。

process.chdir(directory)

改變當(dāng)前工作進(jìn)程的目錄,如果操作失敗拋出異常。

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

process.cwd()

返回當(dāng)前進(jìn)程的工作目錄:

console.log('Current directory: ' + process.cwd());

process.env

包含用戶環(huán)境的對(duì)象,參見environ(7).

這個(gè)對(duì)象的例子:

{ TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/node' }

你可以寫入這個(gè)對(duì)象,但是不會(huì)改變當(dāng)前運(yùn)行的進(jìn)程。以下的命令不會(huì)成功:

node -e 'process.env.foo = "bar"' && echo $foo

這個(gè)會(huì)成功:

process.env.foo = 'bar';
console.log(process.env.foo);

process.exit([code])

使用指定的code結(jié)束進(jìn)程。如果忽略,將會(huì)使用code 0

使用失敗的代碼退出:

process.exit(1);

Shell將會(huì)看到退出代碼為1.

process.exitCode

進(jìn)程退出時(shí)的代碼,如果進(jìn)程優(yōu)雅的退出,或者通過process.exit()退出,不需要指定退出碼。

設(shè)定process.exit(code)將會(huì)重寫之前設(shè)置的process.exitCode。

process.getgid()

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

獲取進(jìn)程的群組標(biāo)識(shí)(參見getgid(2))。獲取到得時(shí)群組的數(shù)字id,而不是名字。

if (process.getgid) {
  console.log('Current gid: ' + process.getgid());
}

process.setgid(id)

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows 和 Android)。

設(shè)置進(jìn)程的群組標(biāo)識(shí)(參見setgid(2))??梢越邮諗?shù)字ID或者群組名。如果指定了群組名,會(huì)阻塞等待解析為數(shù)字ID 。

if (process.getgid && process.setgid) {
  console.log('Current gid: ' + process.getgid());
  try {
    process.setgid(501);
    console.log('New gid: ' + process.getgid());
  }
  catch (err) {
    console.log('Failed to set gid: ' + err);
  }
}

process.getuid()

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

獲取進(jìn)程的用戶標(biāo)識(shí)(參見getuid(2))。這是數(shù)字的用戶id,不是用戶名:

if (process.getuid) {
  console.log('Current uid: ' + process.getuid());
}

process.setuid(id)

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

設(shè)置進(jìn)程的用戶標(biāo)識(shí)(參見setuid(2))。接收數(shù)字ID或字符串名字。果指定了群組名,會(huì)阻塞等待解析為數(shù)字ID。

if (process.getuid && process.setuid) {
  console.log('Current uid: ' + process.getuid());
  try {
    process.setuid(501);
    console.log('New uid: ' + process.getuid());
  }
  catch (err) {
    console.log('Failed to set uid: ' + err);
  }
}

process.getgroups()

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

返回進(jìn)程的群組iD數(shù)組。POSIX系統(tǒng)沒有保證一定有,但是node.js保證有。

process.setgroups(groups)

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

設(shè)置進(jìn)程的群組ID。這是授權(quán)操作,所有你需要有root權(quán)限,或者有CAP_SETGID能力。

列表可以包含群組IDs,群組名,或者兩者都有。

process.initgroups(user, extra_group)

注意:這個(gè)函數(shù)僅在POSIX平臺(tái)上可用(例如,非Windows和Android)。

讀取/etc/group ,并初始化群組訪問列表,使用成員所在的所有群組。這是授權(quán)操作,所有你需要有root權(quán)限,或者有CAP_SETGID能力。

user是用戶名或者用戶ID,extra_group是群組名或群組ID。

當(dāng)你在注銷權(quán)限 (dropping privileges) 的時(shí)候需要注意. 例子:

console.log(process.getgroups());         // [ 0 ]
process.initgroups('bnoordhuis', 1000);   // switch user
console.log(process.getgroups());         // [ 27, 30, 46, 1000, 0 ]
process.setgid(1000);                     // drop root gid
console.log(process.getgroups());         // [ 27, 30, 46, 1000 ]

process.version

一個(gè)編譯屬性,包含NODE_VERSION。

console.log('Version: ' + process.version);

process.versions

一個(gè)屬性,包含了node的版本和依賴。

console.log(process.versions);

打印出來:

{ http_parser: '1.0',
  node: '0.10.4',
  v8: '3.14.5.8',
  ares: '1.9.0-DEV',
  uv: '0.10.3',
  zlib: '1.2.3',
  modules: '11',
  openssl: '1.0.1e' }

process.config

一個(gè)包含用來編譯當(dāng)前node執(zhí)行文件的javascript配置選項(xiàng)的對(duì)象。它與運(yùn)行./configure 腳本生成的"config.gypi"文件相同。

一個(gè)可能的輸出:

{ target_defaults:
   { cflags: [],
     default_configuration: 'Release',
     defines: [],
     include_dirs: [],
     libraries: [] },
  variables:
   { host_arch: 'x64',
     node_install_npm: 'true',
     node_prefix: '',
     node_shared_cares: 'false',
     node_shared_http_parser: 'false',
     node_shared_libuv: 'false',
     node_shared_v8: 'false',
     node_shared_zlib: 'false',
     node_use_dtrace: 'false',
     node_use_openssl: 'true',
     node_shared_openssl: 'false',
     strict_aliasing: 'true',
     target_arch: 'x64',
     v8_use_snapshot: 'true' } }

process.kill(pid[, signal])

發(fā)送信號(hào)給進(jìn)程。pid是進(jìn)程id,并且signal是發(fā)送的信號(hào)的字符串描述。信號(hào)名是字符串,比如'SIGINT'或'SIGHUP'。如果忽略,信號(hào)會(huì)是'SIGTERM'。更多信息參見Signal 事件和kill(2) .

如果進(jìn)程沒有退出,會(huì)拋出錯(cuò)誤。信號(hào)0可以用來測(cè)試進(jìn)程是否存在。

注意,雖然這個(gè)這個(gè)函數(shù)名叫process.kill,它真的僅是信號(hào)發(fā)射器,就像kill系統(tǒng)調(diào)用。信號(hào)發(fā)射可以做其他事情,不僅是殺死目標(biāo)進(jìn)程。

例子, 給自己發(fā)信號(hào):

process.on('SIGHUP', function() {
  console.log('Got SIGHUP signal.');
});

setTimeout(function() {
  console.log('Exiting.');
  process.exit(0);
}, 100);

process.kill(process.pid, 'SIGHUP');

注意:當(dāng)Node.js接收到SIGUSR1信號(hào),它會(huì)開啟debugger調(diào)試模式, 參見Signal Events.

process.pid

當(dāng)前進(jìn)程的PID:

console.log('This process is pid ' + process.pid);

process.title

獲取/設(shè)置(Getter/setter) 'ps'中顯示的進(jìn)程名。

使用setter時(shí),字符串的長(zhǎng)度由系統(tǒng)指定,可能會(huì)很短。

在Linux和OS X上,它受限于名稱的長(zhǎng)度加上命令行參數(shù)的長(zhǎng)度,因?yàn)樗鼤?huì)覆蓋參數(shù)內(nèi)存(argv memory)。

v0.8版本允許更長(zhǎng)的進(jìn)程標(biāo)題字符串,也支持覆蓋環(huán)境內(nèi)存,但是存在潛在的不安全和混亂(很難說清楚)。

process.arch

當(dāng)前CPU的架構(gòu):'arm'、'ia32'或者'x64'。

console.log('This processor architecture is ' + process.arch);

process.platform

運(yùn)行程序所在的平臺(tái)系統(tǒng)'darwin','freebsd','linux','sunos'或者'win32'

console.log('This platform is ' + process.platform);

process.memoryUsage()

返回一個(gè)對(duì)象,描述了Node進(jìn)程所用的內(nèi)存狀況,單位為字節(jié)。

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

將會(huì)生成:

{ rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472 }

heapTotalheapUsed指V8的內(nèi)存使用情況。

process.nextTick(callback)

  • callback{Function}

一旦當(dāng)前事件循環(huán)結(jié)束,調(diào)用回到函數(shù)。

這不是setTimeout(fn, 0)的簡(jiǎn)單別名,這個(gè)效率更高。在任何附加I/O事件在子隊(duì)列事件循環(huán)中觸發(fā)前,它就會(huì)運(yùn)行。

console.log('start');
process.nextTick(function() {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callback

在對(duì)象構(gòu)造后,在I/O事件發(fā)生前,你又想改變附加事件處理函數(shù)時(shí),這個(gè)非常有用。

function MyThing(options) {
  this.setupOptions(options);

  process.nextTick(function() {
    this.startDoingStuff();
  }.bind(this));
}

var thing = new MyThing();
thing.getReadyForStuff();

// thing.startDoingStuff() gets called now, not before.

要保證你的函數(shù)一定是100%同步執(zhí)行,或者100%異步執(zhí)行。例子:

// WARNING!  DO NOT USE!  BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
  if (arg) {
    cb();
    return;
  }

  fs.stat('file', cb);
}

這個(gè)API非常危險(xiǎn). 如果你這么做:

maybeSync(true, function() {
  foo();
});
bar();

不清楚foo()bar()哪個(gè)先執(zhí)行。

更好的方法:

function definitelyAsync(arg, cb) {
  if (arg) {
    process.nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}

注意:nextTick隊(duì)列會(huì)在完全執(zhí)行完畢之后才調(diào)用I/O操作。因此,遞歸設(shè)置nextTick的回調(diào)就像一個(gè)while(true);循環(huán)一樣,將會(huì)阻止任何I/O操作的發(fā)生。

process.umask([mask])

設(shè)置或讀取進(jìn)程文件的掩碼。子進(jìn)程從父進(jìn)程繼承掩碼。如果mask參數(shù)有效,返回舊的掩碼。否則,返回當(dāng)前掩碼。

var oldmask, newmask = 0022;

oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
            ' to ' + newmask.toString(8));

process.uptime()

返回Node已經(jīng)運(yùn)行的秒數(shù)。

process.hrtime()

返回當(dāng)前進(jìn)程的高分辨時(shí)間,形式為[seconds, nanoseconds]數(shù)組。它是相對(duì)于過去的任意事件。該值與日期無關(guān),因此不受時(shí)鐘漂移的影響。主要用途是可以通過精確的時(shí)間間隔,來衡量程序的性能。

你可以將之前的結(jié)果傳遞給當(dāng)前的process.hrtime(),會(huì)返回兩者間的時(shí)間差,用來基準(zhǔn)和測(cè)量時(shí)間間隔。

var time = process.hrtime();
// [ 1800216, 25 ]

setTimeout(function() {
  var diff = process.hrtime(time);
  // [ 1, 552 ]

  console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]);
  // benchmark took 1000000527 nanoseconds
}, 1000);

process.mainModule

require.main的備選方法。不同點(diǎn),如果主模塊在運(yùn)行時(shí)改變,require.main可能會(huì)繼續(xù)返回老的模塊。可以認(rèn)為,這兩者引用了同一個(gè)模塊。

process.mainModule屬性提供了一種替代的檢索方式require.main。不同之處在于,如果主模塊在運(yùn)行時(shí)發(fā)生更改,require.main可能仍會(huì)引用發(fā)生更改之前所需模塊中的原始主模塊。通常,假設(shè)這兩個(gè)參照相同的模塊是安全的。

require.main一樣, 如果沒有入口腳本,將會(huì)返回undefined。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)