Node報錯: ReferenceError: xxxx is not defined
錯誤含義:
ReferenceError: __dirname is not defined
🌐文檔

由文檔可知__dirname是一個全局變量,但實際又不是一個全局變量。
因為__filename和 __dirname在ES模塊中不存在。

如果最近的父package.json包含“type”:“module”,則以.js結尾的文件將被加載為ES模塊。(---參考)
案例1:
有一個文件test.js包含以下內容:
console.log(__dirname)
console.log(__filename)
然后使用以下命令,執行此文件
node test.js
發生了以下錯誤:

如果你在package.json中使用了以下配置,那么這就是錯誤的原因,只要把它刪除即可。
{
...
"type": "module"
}
// 它的作用是使Node支持ES6模塊化
最后運行成功:

如果要同時使用Node模塊化又想要獲取當前路徑,可以使用以下方法:

import path from "path"
const __dirname = path.resolve();
案例2:
在REPL下使用console.log(__dirname)命令同樣會報錯

因為__dirname表示的是當前腳本文件目錄,在node 的交互式解釋器下根本就沒有腳本文件,所以__dirname也就沒有意義。(參考)
你可以使用path.resolve()在REPL下獲取當前目錄。
ReferenceError: document is not defined
🌐參考資料
使用node執行js文件,文件中包含document對象,執行時就會發生document is not defined錯誤。
// 例如:
document.write("Hello")
因為Node運行js文件的引擎是基於Chrome的V8 JavaScript 引擎,而document是屬於DOM操作,只能在瀏覽器環境下才能實現,所以會報錯。
如果想要在node.js環境下使用document對象,請參考此文。
ReferenceError: require|module is not defined

出現錯誤的情景:
使用webpack打包,配置文件如下:
const path = require("path"); //Node.js內置模塊
module.exports = {
entry: './src/main.js', //配置入口文件
output: {
path: path.resolve('./dist'), //輸出路徑,Node.js下__dirname表示'當前文件所在路徑'
// path: path.resolve('__dirname', ./dist') 此種情況下會報錯,"ReferenceError: __dirname is not defined"
filename: 'bundle.js' //輸出文件,生成一個bundle
}
其最近的父package.json文件包含:
{
...
"type": "module"
}
執行命令webpack時報錯ReferenceError: require is not defined
原因:
如果最近的父package.json包含“type”:“module”,則以.js結尾的文件將被加載為ES模塊。而ES模塊中是不支持require的。(---參考)

module.exports
對當前模塊的一個引用,查看關於
module對象的章節。module.exports特別地被用於定義一個模塊導出什么並且通過require()可用。
解決辦法:
- 將
"type": "module"從package.json中刪除 - 使用import導入模塊,並且需要改變導出模塊的方式。否則會遇到以下問題

//const path = require("path"); //Node.js內置模塊
import path from "path";
// es6導出方式
export default
{
entry: './src/main.js', //配置入口文件
output: {
path: path.resolve('./dist'), //輸出路徑,Node.js下__dirname表示'當前文件所在路徑'
// path: path.resolve('__dirname', ./dist') 此種情況下會報錯,"ReferenceError: __dirname is not defined"
filename: 'bundle.js' //輸出文件,生成一個bundle
}
};
