亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將“ Vanilla” Javascript庫加載到Node.js中

將“ Vanilla” Javascript庫加載到Node.js中

MYYA 2019-11-22 15:59:53
我希望在Node.js服務器中使用某些具有某些功能的第三方Javascript庫。(特別是我想使用找到的QuadTree javascript庫。)但是這些庫只是簡單的.js文件,而不是“ Node.js庫”。因此,這些庫未遵循exports.var_nameNode.js對其模塊期望的語法。據我了解,這意味著當您這樣做時,module = require('module_name');或者module = require('./path/to/file.js');最終將得到一個沒有公共可訪問功能的模塊,等等。然后我的問題是“如何將一個任意的javascript文件加載到Node.js中,這樣我就可以利用其功能而不必重寫它來做到這一點exports?”我對Node.js還是很陌生,所以請讓我知道我對它的工作方式是否有明顯的了解。編輯:進行了更多的研究,現在我看到Node.js使用的模塊加載模式實際上是最近開發的用于加載稱為CommonJS的 Javascript庫的標準的一部分。它在Node.js的模塊文檔頁面上說的是正確的,但直到現在我都沒想到。最終,我的問題的答案可能是“等到您的庫的作者開始編寫CommonJS接口或做該死的自我時,”。javascript node.js 
查看完整描述

3 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

有比使用eval:vm模塊更好的方法。


例如,這是我的execfile模塊,該模塊path在context或全局上下文中評估腳本:


var vm = require("vm");

var fs = require("fs");

module.exports = function(path, context) {

  context = context || {};

  var data = fs.readFileSync(path);

  vm.runInNewContext(data, context, path);

  return context;

}

可以這樣使用:


> var execfile = require("execfile");

> // `someGlobal` will be a global variable while the script runs

> var context = execfile("example.js", { someGlobal: 42 });

> // And `getSomeGlobal` defined in the script is available on `context`:

> context.getSomeGlobal()

42

> context.someGlobal = 16

> context.getSomeGlobal()

16

其中example.js包含:


function getSomeGlobal() {

    return someGlobal;

}

該方法的最大優點是您可以完全控制已執行腳本中的全局變量:您可以傳入自定義全局變量(通過context),并且腳本創建的所有全局變量都將添加到中context。調試也更加容易,因為將使用正確的文件名報告語法錯誤等。


查看完整回答
反對 回復 2019-11-22
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

對于這種情況,我認為這是“最正確的”答案。


假設您有一個名為的腳本文件quadtree.js。


您應該構建node_module具有這種目錄結構的自定義...


./node_modules/quadtree/quadtree-lib/

./node_modules/quadtree/quadtree-lib/quadtree.js

./node_modules/quadtree/quadtree-lib/README

./node_modules/quadtree/quadtree-lib/some-other-crap.js

./node_modules/quadtree/index.js

./node_modules/quadtree/quadtree-lib/目錄中的所有內容都是來自第3方庫的文件。


然后,您的./node_modules/quadtree/index.js文件將只從文件系統中加載該庫,并完成正確導出內容的工作。


var fs = require('fs');


// Read and eval library

filedata = fs.readFileSync('./node_modules/quadtree/quadtree-lib/quadtree.js','utf8');

eval(filedata);


/* The quadtree.js file defines a class 'QuadTree' which is all we want to export */


exports.QuadTree = QuadTree

現在,您可以quadtree像其他任何節點模塊一樣使用模塊了。


var qt = require('quadtree');

qt.QuadTree();

我喜歡這種方法,因為不需要更改您的第3方庫的任何源代碼,因此維護起來更容易。升級所需要做的只是查看其源代碼,并確保您仍在導出適當的對象。


查看完整回答
反對 回復 2019-11-22
  • 3 回答
  • 0 關注
  • 673 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號