我在任何地方都找不到這個問題的具體答案。
將 ParseServer 與 Back4App 一起使用。
我想知道需要 NPM 包的最佳位置,以及這兩種方法有什么區別。
main.js - 全域檔案需要示例
const otpGenerator = require('otp-generator');
Parse.Cloud.define("TEST", async (request) => {
let code = otpGenerator.generate(10, {alphabets: false, specialChars: false});
console.log(code);
});
main.js - 函式需要示例
Parse.Cloud.define("TEST", async (request) => {
const otpGenerator = require('otp-generator');
let code = otpGenerator.generate(10, {alphabets: false, specialChars: false});
console.log(code);
});
就上述小測驗而言,兩者都可以作業......
uj5u.com熱心網友回復:
在 Node/CommonJS 背景關系中require()表明您正在運行時加載模塊。
假設我們有一個模塊 A,其中包含一個require(moduleB)(可能在 node_modules 或本地檔案中)。然后當達到要求陳述句時,基本上會發生以下情況:
- 在模塊 A 的呼叫背景關系中執行停止
- 節點查找并評估指定的模塊 B(決議等)
- 在模塊 B 的頂部繼續執行
- 假設模塊 B 的決議和執行沒有問題,則執行回傳到模塊 A,提供的內容
module.exports本質上是呼叫的回傳值require()
(請注意,這是非常簡化的,我忽略了很多細節,但大致就是這樣)。
因此,這將加載模塊視為類似于呼叫函式。(這與在決議時“提前”評估的標準 ECMAScript 模塊形成對比,因此它們必須位于檔案的頂部)。
現在鑒于此,我們可以看到為什么呼叫的位置require()非常重要。
在您給出的示例中,它在功能上無關緊要,因為只有一個塊,這是唯一被執行的東西。此外,被匯入的包可能表現良好并且沒有執行一堆副作用。然而,在其他情況下,它變得更加重要。
如果我看到這樣的代碼:
if(someCondition){
require('./my-module1.js')
} else {
const something = require('some-module')
}
或者我們在整個代碼中分散呼叫 require 的其他模式。然后我會認為這是一種潛在的不良代碼氣味,因為它表明我們正在使用 require 加載代碼塊,可能會產生副作用,而不是將我們需要的內容封裝在定義良好的函式和類等中。
它還掩蓋了加載什么代碼以及何時加載,這可能會成為除錯的噩夢。
而如果我們所有的require()呼叫都在檔案的頂部,那么我們是:
- 消除加載/執行內容以及何時加載的任何潛在歧義
- 在代碼檔案的頂部清楚地指出以下代碼的依賴關系是什么。
- 遵循在決議時加載依賴項的其他代碼(例如 ES 模塊、其他語言)的既定約定
它確實變得有點復雜,因為可能在某些情況下我們希望動態加載代碼,例如出于優化目的,但為了代碼的清晰和整潔,默認情況下應該將所有require()呼叫放在代碼的頂部,并且在任何執行塊之外。
有關更多詳細資訊,請參閱 NodeJS 檔案:
- CommonJS 模塊
- ECMAScript 模塊
PS:在需要模塊進行測驗的具體示例中,如您的示例中,那么您是否希望在設定測驗時或測驗本身運行時加載模塊,將取決于幾個因素。通過在測驗中包含 require 呼叫,您實際上也在測驗所需的代碼,并且您會在該測驗下看到其中出現的任何錯誤,但是如果您將其包含在外部,那么您基本上認為所需的代碼是理所當然的,并在它們之間共享你所有的測驗。
uj5u.com熱心網友回復:
標準做法是將所有匯入/要求放在頂部,除非您有充分的理由不這樣做,例如它是一個可選依賴項。
uj5u.com熱心網友回復:
在頂部匯入包是一個好習慣。這樣可以直觀地清楚您將使用哪些庫,并且在使用之前加載資料可以避免編譯和性能問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/498283.html
