Trong Node.js, làm thế nào để tôi có thể bao gồm các hàm từ các tệp khác của tôi?


967

Giả sử tôi có một tệp có tên app.js. Khá đơn giản:

var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
  res.render('index', {locals: {
    title: 'NowJS + Express Example'
  }});
});

app.listen(8080);

Điều gì xảy ra nếu tôi có một hàm bên trong "tools.js". Làm cách nào để tôi nhập chúng để sử dụng trong apps.js?

Hoặc ... tôi có nên biến "công cụ" thành một mô-đun, và sau đó yêu cầu nó không? << có vẻ khó, tôi thực hiện nhập dữ liệu cơ bản của tệp tools.js.


4
Điều khiến tôi thất vọng ở đây là requireing một thư mục trong cùng thư mục trên Windows. Bạn đã phải sử dụng địa chỉ unix-style: ./mydirthay vì đơn giản cũ mydir.
Ben

1
Tôi đã tạo một mô-đun để nhập tập lệnh, xuất thành tập tin và bao gồm mô-đun từ node_modulesthư mục bên ngoài . npmjs.com/package/node-import Hy vọng nó có thể giúp đỡ. Cảm ơn!
Nanang Mahdaen El-Agung

Câu trả lời:


1415

Bạn có thể yêu cầu bất kỳ tập tin js, bạn chỉ cần khai báo những gì bạn muốn phơi bày.

// tools.js
// ========
module.exports = {
  foo: function () {
    // whatever
  },
  bar: function () {
    // whatever
  }
};

var zemba = function () {
}

Và trong tệp ứng dụng của bạn:

// app.js
// ======
var tools = require('./tools');
console.log(typeof tools.foo); // => 'function'
console.log(typeof tools.bar); // => 'function'
console.log(typeof tools.zemba); // => undefined

101
+1 Hoàn thành tốt, thậm chí giới hạn mã đã nhập vào không gian tên của chính nó. Tôi sẽ phải ghi chú lại điều này sau.
Evan Plaice

8
Tôi tự hỏi nếu nó có thể nhập các tập lệnh bên ngoài. require("http://javascript-modules.googlecode.com/svn/functionChecker.js")dường như không nhập mô-đun chính xác. Có cách nào khác để nhập tập lệnh bên ngoài không?
Anderson Green

6
Và điều gì xảy ra nếu tôi phải chuyển biến vào hàm Like, bar: function (a, b) {// một số mã}
Nishutosh Sharma

5
Vì bạn đang phơi bày các thuộc tính, tôi sẽ sử dụng xuất khẩu thay vì module.exports. Đối với xuất khẩu so với module.exports: stackoverflow.com/questions/5311334/ từ
Trang trại

4
làm thế nào để gọi hàm bar (), bên trong hàm foo (), có nghĩa là làm thế nào để truy cập một chức năng mà không phải là một chức năng khác
pitu

303

Nếu, mặc dù tất cả các câu trả lời khác, theo truyền thống, bạn vẫn muốn bao gồm một tệp trong tệp nguồn node.js, bạn có thể sử dụng:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • Việc nối chuỗi rỗng +''là cần thiết để lấy nội dung tệp dưới dạng chuỗi chứ không phải đối tượng (bạn cũng có thể sử dụng .toString()nếu muốn).
  • Không thể sử dụng eval () bên trong hàm và phải được gọi bên trong phạm vi toàn cục nếu không sẽ không có hàm hoặc biến nào có thể truy cập được (tức là bạn không thể tạo include()hàm tiện ích hoặc đại loại như thế).

Xin lưu ý rằng trong hầu hết các trường hợp, đây là thực tiễn xấu và thay vào đó bạn nên viết một mô-đun . Tuy nhiên, có những tình huống hiếm gặp, trong đó ô nhiễm không gian / bối cảnh địa phương của bạn là điều bạn thực sự muốn.

Cập nhật 2015-08-06

Cũng xin lưu ý rằng điều này sẽ không hoạt động với "use strict";(khi bạn ở "chế độ nghiêm ngặt" ) vì các hàm và biến được xác định trong tệp "đã nhập" không thể được truy cập bằng mã nhập. Chế độ nghiêm ngặt thực thi một số quy tắc được xác định bởi các phiên bản mới hơn của tiêu chuẩn ngôn ngữ. Đây có thể là một lý do khác để tránh các giải pháp được mô tả ở đây.


41
Thật tuyệt, điều này rất hữu ích cho việc nhanh chóng đưa các lib lib được thiết kế cho phía máy khách vào ứng dụng node.js mà không cần phải duy trì một ngã ba theo kiểu Node.
Kos

18
Tôi chỉ trả lời câu hỏi ban đầu, đó là về việc bao gồm mã, không viết các mô-đun. Các cựu có thể có lợi thế trong các tình huống nhất định. Ngoài ra, giả định của bạn về yêu cầu là sai: Mã chắc chắn là eval'd, nhưng nó vẫn nằm trong không gian tên của chính nó và không có cách nào để "làm ô nhiễm" không gian tên của bối cảnh gọi, do đó bạn cần phải tự đánh giá nó. Trong hầu hết các trường hợp, sử dụng phương thức được mô tả trong anwer của tôi là một thực tiễn tồi nhưng không phải tôi quyết định liệu nó có dành cho TIMEX hay không.
Udo G

14
@EvanPlaice: bạn có gợi ý nào tốt hơn để trả lời câu hỏi không? Nếu bạn cần bao gồm một tệp không phải là một mô-đun , bạn có cách tiếp cận nào tốt hơn cái này không?
jalf

8
Đôi khi bạn cần bao gồm và đôi khi yêu cầu, chúng là hai khái niệm khác nhau cơ bản trong hầu hết các ngôn ngữ lập trình, Node JS. Khả năng bao gồm js tại chỗ nên là một phần của Node phải trung thực, nhưng đánh giá nó về cơ bản là một giải pháp tốt. Nâng cao.
J. Martin

4
Lưu ý rằng không tương thích với việc sử dụng nghiêm ngặt - vì việc sử dụng nghiêm ngặt sẽ hạn chế việc sử dụng eval bằng cách chặn giới thiệu các biến mới thông qua eval, v.v.
timbo 3/214

189

Bạn không cần chức năng mới cũng như mô-đun mới. Bạn chỉ cần thực thi mô-đun bạn đang gọi nếu bạn không muốn sử dụng không gian tên.

trong tools.js

module.exports = function() { 
    this.sum = function(a,b) { return a+b };
    this.multiply = function(a,b) { return a*b };
    //etc
}

trong app.js

hoặc trong bất kỳ .js nào khác như myControll.js:

thay vì

var tools = require('tools.js') buộc chúng ta phải sử dụng một không gian tên và các công cụ gọi như tools.sum(1,2);

chúng ta chỉ cần gọi

require('tools.js')();

và sau đó

sum(1,2);

trong trường hợp của tôi, tôi có một tệp với bộ điều khiển ctrls.js

module.exports = function() {
    this.Categories = require('categories.js');
}

và tôi có thể sử dụng Categoriestrong mọi ngữ cảnh như lớp công khai saurequire('ctrls.js')()


12
Làm thế nào mà cái này không có nhiều +1? Đây là một giải pháp thực sự cho những gì câu hỏi yêu cầu (mặc dù không phải là 'chính thức'). Nó cũng dễ gỡ lỗi hơn một triệu lần so với eval () vì nút có thể đưa ra một ngăn xếp cuộc gọi hữu ích thay vì chỉ vào tệp thực tế thay vì chỉ không xác định.
dùng3413723

5
Lưu ý rằng bạn không thể "sử dụng chế độ" nghiêm ngặt "trong mô-đun đã nhập.
David

1
@Nick Panov: rực rỡ! Cần lưu ý rằng điều này hoạt động vì thistrong một hàm là phạm vi toàn cục khi hàm được gọi trực tiếp (không bị ràng buộc theo bất kỳ cách nào).
Udo G

3
điều này chỉ thay đổi cuộc sống của tôi, không phải trò đùa - có hơn 1000 tệp dòng mà tôi không thể chia tay vì các biến của các phương thức khác nhau đều có mối tương quan với nhau và sẽ cần tất cả các yêu cầu trong cùng một phạm vi ... require('blah.js')();nên cho phép tôi nhập tất cả chúng vào cùng một phạm vi !!! cảm ơn!!!
Sam Johnson

2
Đây là một mẹo tuyệt vời! Hãy cẩn thận: nếu bạn khai báo hàm module.exports bằng cách sử dụng cú pháp phím tắt () => {} thay vì khai báo hàm chuẩn () {}, thì không thành công. Mất một giờ để tìm ra vấn đề ở đâu! (Chức năng mũi tên không có của riêng của họ sở hữu 'này': developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... )
Ryan Griggs

117

Tạo hai tập tin js

// File cal.js
module.exports = {
    sum: function(a,b) {
        return a+b
    },
    multiply: function(a,b) {
        return a*b
    }
};

Tập tin js chính

// File app.js
var tools = require("./cal.js");
var value = tools.sum(10,20);
console.log("Value: "+value);

Bảng điều khiển đầu ra

Value: 30

Phiên bản nào của js không hoạt động?
Mirv - Matt

39

Đây là một lời giải thích đơn giản và đơn giản:

Nội dung của Server.js:

// Include the public functions from 'helpers.js'
var helpers = require('./helpers');

// Let's assume this is the data which comes from the database or somewhere else
var databaseName = 'Walter';
var databaseSurname = 'Heisenberg';

// Use the function from 'helpers.js' in the main file, which is server.js
var fullname = helpers.concatenateNames(databaseName, databaseSurname);

Nội dung của Helpers.js:

// 'module.exports' is a node.JS specific feature, it does not work with regular JavaScript
module.exports = 
{
  // This is the function which will be called in the main file, which is server.js
  // The parameters 'name' and 'surname' will be provided inside the function
  // when the function is called in the main file.
  // Example: concatenameNames('John,'Doe');
  concatenateNames: function (name, surname) 
  {
     var wholeName = name + " " + surname;

     return wholeName;
  },

  sampleFunctionTwo: function () 
  {

  }
};

// Private variables and functions which will not be accessible outside this file
var privateFunction = function () 
{
};

34

Tôi cũng đang tìm kiếm một chức năng 'bao gồm' của NodeJS và tôi đã kiểm tra giải pháp được đề xuất bởi Udo G - xem tin nhắn https://stackoverflow.com/a/8744519/2979590 . Mã của anh ấy không hoạt động với các tệp JS được bao gồm của tôi. Cuối cùng tôi đã giải quyết vấn đề như thế:

var fs = require("fs");

function read(f) {
  return fs.readFileSync(f).toString();
}
function include(f) {
  eval.apply(global, [read(f)]);
}

include('somefile_with_some_declarations.js');

Chắc chắn, điều đó sẽ giúp.


2
Tôi hiểu sự xấu xí của một vụ hack này, nhưng nó chắc chắn đã giúp tôi thoát ra.
lindhe

30

tạo hai tập tin, ví dụ app.jstools.js

app.js

const tools= require("./tools.js")


var x = tools.add(4,2) ;

var y = tools.subtract(4,2);


console.log(x);
console.log(y);

tools.js

 const add = function(x, y){
        return x+y;
    }
 const subtract = function(x, y){
            return x-y;
    }

    module.exports ={
        add,subtract
    }

đầu ra

6
2

26

nói rằng chúng ta muốn gọi hàm ping ()thêm (30,20) mà là ở lib.js tập tin từ main.js

main.js

lib = require("./lib.js")

output = lib.ping();
console.log(output);

//Passing Parameters
console.log("Sum of A and B = " + lib.add(20,30))

lib.js

this.ping=function ()
{
    return  "Ping Success"
}
//Functions with parameters
this.add=function(a,b)
    {
        return a+b
    }

1
Điều này hoạt động, nhưng chúng ta không nên sử dụng cú pháp mô-đun khi bao gồm các tập lệnh?
Kokodoko

25

Mô-đun vm trong Node.js cung cấp khả năng thực thi mã JavaScript trong bối cảnh hiện tại (bao gồm cả đối tượng toàn cầu). Xem http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_filename

Lưu ý rằng, cho đến ngày hôm nay, có một lỗi trong mô-đun vm đã khởi chạy runIn ThisContext khi thực hiện đúng khi được gọi từ một bối cảnh mới. Điều này chỉ quan trọng nếu chương trình chính của bạn thực thi mã trong một ngữ cảnh mới và sau đó mã đó gọi runIn ThisContext. Xem https://github.com/joyent/node/issues/898

Đáng buồn thay, cách tiếp cận với (toàn cầu) mà Fernando đề xuất không hoạt động đối với các hàm được đặt tên như "function foo () {}"

Nói tóm lại, đây là một hàm include () hoạt động với tôi:

function include(path) {
    var code = fs.readFileSync(path, 'utf-8');
    vm.runInThisContext(code, path);
}

Tôi đã tìm thấy vm.runIn ThisContext trong một câu trả lời SO khác và đã sử dụng nó, để bao gồm các tệp mã Javascript "vanilla". Tuy nhiên, sau đó tôi đã cố gắng sử dụng nó để bao gồm mã phụ thuộc vào chức năng của nút (ví dụ: "var fs = quiries ('fs')") và nó sẽ không hoạt động. Tuy nhiên, trong trường hợp đó, (các) giải pháp "eval" được ghi chú trong một vài câu trả lời, thực sự có hiệu quả.
Dexygen

Nghĩ về điều này nhiều hơn một chút, khi bạn bắt đầu cần bao gồm mã phụ thuộc vào chức năng của nút, có lẽ đã đến lúc viết một mô-đun, mặc dù giải pháp eval có thể là bước đầu tiên trong quy trình đó
Dexygen

Chỉ có một hoạt động trong node.js vào năm 2019
meesern

13

Udo G. nói:

  • Không thể sử dụng eval () bên trong hàm và phải được gọi bên trong phạm vi toàn cục nếu không sẽ không có hàm hoặc biến nào có thể truy cập được (tức là bạn không thể tạo hàm tiện ích bao gồm () hoặc đại loại như thế).

Anh ấy đúng, nhưng có một cách để ảnh hưởng đến phạm vi toàn cầu từ một chức năng. Cải thiện ví dụ của anh ấy:

function include(file_) {
    with (global) {
        eval(fs.readFileSync(file_) + '');
    };
};

include('somefile_with_some_declarations.js');

// the declarations are now accessible here.

Hy vọng, điều đó sẽ giúp.


12

Nó làm việc với tôi như sau ....

Lib1.js

//Any other private code here 

// Code you want to export
exports.function1 = function(params) {.......};
exports.function2 = function(params) {.......};

// Again any private code

bây giờ trong tệp Main.js bạn cần bao gồm Lib1.js

var mylib = requires('lib1.js');
mylib.function1(params);
mylib.function2(params);

Hãy nhớ đặt Lib1.js trong thư mục node_modules .


11

Bạn có thể đặt các hàm của mình trong các biến toàn cục, nhưng tốt hơn hết là chỉ cần biến tập lệnh công cụ của bạn thành một mô-đun. Nó thực sự không quá khó - chỉ cần đính kèm API công khai của bạn vào exportsđối tượng. Hãy xem mô-đun xuất khẩu của Node.js để biết thêm chi tiết.


1
Một ví dụ tốt hơn một liên kết
tno2007

11

Theo tôi, một cách khác để thực hiện điều này là thực thi mọi thứ trong tệp lib khi bạn gọi hàm request () bằng cách sử dụng (hàm (/ * thứ ở đây * /) {}) (); làm điều này sẽ làm cho tất cả các hàm này phạm vi toàn cầu, chính xác như giải pháp eval ()

src / lib.js

(function () {
    funcOne = function() {
            console.log('mlt funcOne here');
    }

    funcThree = function(firstName) {
            console.log(firstName, 'calls funcThree here');
    }

    name = "Mulatinho";
    myobject = {
            title: 'Node.JS is cool',
            funcFour: function() {
                    return console.log('internal funcFour() called here');
            }
    }
})();

Và sau đó trong mã chính của bạn, bạn có thể gọi các hàm của mình bằng tên như:

main.js

require('./src/lib')
funcOne();
funcThree('Alex');
console.log(name);
console.log(myobject);
console.log(myobject.funcFour());

Sẽ làm cho đầu ra này

bash-3.2$ node -v
v7.2.1
bash-3.2$ node main.js 
mlt funcOne here
Alex calls funcThree here
Mulatinho
{ title: 'Node.JS is cool', funcFour: [Function: funcFour] }
internal funcFour() called here
undefined

Hãy chú ý đến cái không xác định khi bạn gọi đối tượng của tôi.funcFour () , nó sẽ giống nhau nếu bạn tải bằng eval () . Hy vọng nó giúp :)


10

Tôi chỉ muốn thêm vào, trong trường hợp bạn chỉ cần một số chức năng nhất định được nhập từ tools.js , thì bạn có thể sử dụng phép gán hủy được hỗ trợ trong node.js kể từ phiên bản 6.4 - xem node.green .


Ví dụ : (cả hai tệp nằm trong cùng một thư mục)

tools.js

module.exports = {
    sum: function(a,b) {
        return a + b;
    },
    isEven: function(a) {
        return a % 2 == 0;
    }
};

main.js

const { isEven } = require('./tools.js');

console.log(isEven(10));

đầu ra: true


Điều này cũng tránh việc bạn gán các hàm đó làm thuộc tính của đối tượng khác như trường hợp của nó trong phép gán (chung) sau:

const tools = require('./tools.js');

nơi bạn cần gọi tools.isEven(10).


GHI CHÚ:

Đừng quên tiền tố tên tệp của bạn với đường dẫn chính xác - ngay cả khi cả hai tệp nằm trong cùng một thư mục, bạn cần phải thêm tiền tố vào ./

Từ tài liệu Node.js :

Nếu không có '/', './' hoặc '../' hàng đầu để chỉ ra một tệp, mô-đun phải là mô-đun lõi hoặc được tải từ thư mục node_modules.


10

app.js

let { func_name } = require('path_to_tools.js');
func_name();    //function calling

tools.js

let func_name = function() {
    ...
    //function body
    ...
};

module.exports = { func_name };

3

Bao gồm tệp và chạy nó trong bối cảnh nhất định (không toàn cầu)

fileToInclude.js

define({
    "data": "XYZ"
});

main.js

var fs = require("fs");
var vm = require("vm");

function include(path, context) {
    var code = fs.readFileSync(path, 'utf-8');
    vm.runInContext(code, vm.createContext(context));
}


// Include file

var customContext = {
    "define": function (data) {
        console.log(data);
    }
};
include('./fileToInclude.js', customContext);

2

Đây là cách tốt nhất tôi đã tạo ra cho đến nay.

var fs = require('fs'),
    includedFiles_ = {};

global.include = function (fileName) {
  var sys = require('sys');
  sys.puts('Loading file: ' + fileName);
  var ev = require(fileName);
  for (var prop in ev) {
    global[prop] = ev[prop];
  }
  includedFiles_[fileName] = true;
};

global.includeOnce = function (fileName) {
  if (!includedFiles_[fileName]) {
    include(fileName);
  }
};

global.includeFolderOnce = function (folder) {
  var file, fileName,
      sys = require('sys'),
      files = fs.readdirSync(folder);

  var getFileName = function(str) {
        var splited = str.split('.');
        splited.pop();
        return splited.join('.');
      },
      getExtension = function(str) {
        var splited = str.split('.');
        return splited[splited.length - 1];
      };

  for (var i = 0; i < files.length; i++) {
    file = files[i];
    if (getExtension(file) === 'js') {
      fileName = getFileName(file);
      try {
        includeOnce(folder + '/' + file);
      } catch (err) {
        // if (ext.vars) {
        //   console.log(ext.vars.dump(err));
        // } else {
        sys.puts(err);
        // }
      }
    }
  }
};

includeFolderOnce('./extensions');
includeOnce('./bin/Lara.js');

var lara = new Lara();

Bạn vẫn cần thông báo những gì bạn muốn xuất

includeOnce('./bin/WebServer.js');

function Lara() {
  this.webServer = new WebServer();
  this.webServer.start();
}

Lara.prototype.webServer = null;

module.exports.Lara = Lara;

2

Giống như bạn đang có một tập tin abc.txtvà nhiều hơn nữa?

Tạo 2 tệp: fileread.jsfetchingfile.jssau đó fileread.jsviết mã này:

function fileread(filename) {
    var contents= fs.readFileSync(filename);
        return contents;
    }

    var fs = require("fs");  // file system

    //var data = fileread("abc.txt");
    module.exports.fileread = fileread;
    //data.say();
    //console.log(data.toString());
}

Trong fetchingfile.jsghi mã này:

function myerror(){
    console.log("Hey need some help");
    console.log("type file=abc.txt");
}

var ags = require("minimist")(process.argv.slice(2), { string: "file" });
if(ags.help || !ags.file) {
    myerror();
    process.exit(1);
}
var hello = require("./fileread.js");
var data = hello.fileread(ags.file);  // importing module here 
console.log(data.toString());

Bây giờ, trong một thiết bị đầu cuối: $ nút fetchingfile.js --file = abc.txt

Bạn đang chuyển tên tệp dưới dạng đối số, hơn nữa bao gồm tất cả các tệp readfile.jsthay vì chuyển nó.

Cảm ơn


2

Bạn có thể đơn giản chỉ cần require('./filename').

Ví dụ.

// file: index.js
var express = require('express');
var app = express();
var child = require('./child');
app.use('/child', child);
app.get('/', function (req, res) {
  res.send('parent');
});
app.listen(process.env.PORT, function () {
  console.log('Example app listening on port '+process.env.PORT+'!');
});
// file: child.js
var express = require('express'),
child = express.Router();
console.log('child');
child.get('/child', function(req, res){
  res.send('Child2');
});
child.get('/', function(req, res){
  res.send('Child');
});

module.exports = child;

Xin lưu ý rằng:

  1. bạn không thể nghe PORT trên tệp con, chỉ mô-đun cha mẹ có trình nghe PORT
  2. Trẻ đang sử dụng 'Bộ định tuyến', không phải cha mẹ Express moudle.

1

Tôi cũng đang tìm kiếm một tùy chọn để bao gồm mã mà không cần viết mô-đun, resp. sử dụng cùng một nguồn độc lập được thử nghiệm từ một dự án khác cho dịch vụ Node.js - và câu trả lời của jmparatte đã làm điều đó cho tôi.

Lợi ích là, bạn không làm ô nhiễm không gian tên, tôi không gặp rắc rối "use strict";và nó hoạt động tốt.

Đây là một mẫu đầy đủ :

Tập lệnh để tải - /lib/foo.js

"use strict";

(function(){

    var Foo = function(e){
        this.foo = e;
    }

    Foo.prototype.x = 1;

    return Foo;

}())

MẫuModule - index.js

"use strict";

const fs = require('fs');
const path = require('path');

var SampleModule = module.exports = {

    instAFoo: function(){
        var Foo = eval.apply(
            this, [fs.readFileSync(path.join(__dirname, '/lib/foo.js')).toString()]
        );
        var instance = new Foo('bar');
        console.log(instance.foo); // 'bar'
        console.log(instance.x); // '1'
    }

}

Hy vọng điều này là hữu ích bằng cách nào đó.


1

Một phương thức khác khi sử dụng khung node.js và express.js

var f1 = function(){
   console.log("f1");
}
var f2 = function(){
   console.log("f2");
}

module.exports = {
   f1 : f1,
   f2 : f2
}

lưu trữ tệp này trong tệp js có tên s và trong trạng thái thư mục

Bây giờ để sử dụng chức năng

var s = require('../statics/s');
s.f1();
s.f2();

1

Tôi đã đưa ra một phương pháp khá thô sơ để xử lý việc này cho việc tạo khuôn mẫu HTML. Tương tự như PHP<?php include("navigation.html"); ?>

server.js

var fs = require('fs');

String.prototype.filter = function(search,replace){
    var regex = new RegExp("{{" + search.toUpperCase() + "}}","ig");
    return this.replace(regex,replace);
}

var navigation = fs.readFileSync(__dirname + "/parts/navigation.html");

function preProcessPage(html){
    return html.filter("nav",navigation);
}

var express = require('express');
var app = express();
// Keep your server directory safe.
app.use(express.static(__dirname + '/public/'));
// Sorta a server-side .htaccess call I suppose.
app.get("/page_name/",function(req,res){
    var html = fs.readFileSync(__dirname + "/pages/page_name.html");
    res.send(preProcessPage(html));
});

page_name.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>NodeJS Templated Page</title>
    <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="/css/font-awesome.min.css">
    <!-- Scripts Load After Page -->
    <script type="text/javascript" src="/js/jquery.min.js"></script>
    <script type="text/javascript" src="/js/tether.min.js"></script>
    <script type="text/javascript" src="/js/bootstrap.min.js"></script>
</head>
<body>
    {{NAV}}
    <!-- Page Specific Content Below Here-->
</body>
</html>

navigation.html

<nav></nav>

Đã tải kết quả trang

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>NodeJS Templated Page</title>
    <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="/css/font-awesome.min.css">
    <!-- Scripts Load After Page -->
    <script type="text/javascript" src="/js/jquery.min.js"></script>
    <script type="text/javascript" src="/js/tether.min.js"></script>
    <script type="text/javascript" src="/js/bootstrap.min.js"></script>
</head>
<body>
    <nav></nav>
    <!-- Page Specific Content Below Here-->
</body>
</html>

0

Nếu bạn muốn tận dụng kiến ​​trúc của nhiều CPU & microservice, để tăng tốc mọi thứ ... Sử dụng RPC trên các quy trình rẽ nhánh.

Nghe có vẻ phức tạp, nhưng thật đơn giản nếu bạn sử dụng bạch tuộc .

Đây là một ví dụ:

trên tools.js thêm:

const octopus = require('octopus');
var rpc = new octopus('tools:tool1');

rpc.over(process, 'processRemote');

var sum = rpc.command('sum'); // This is the example tool.js function to make available in app.js

sum.provide(function (data) { // This is the function body
    return data.a + data.b;
});

trên app.js, thêm:

const { fork } = require('child_process');
const octopus = require('octopus');
const toolprocess = fork('tools.js');

var rpc = new octopus('parent:parent1');
rpc.over(toolprocess, 'processRemote');

var sum = rpc.command('sum');

// Calling the tool.js sum function from app.js
sum.call('tools:*', {
    a:2, 
    b:3
})
.then((res)=>console.log('response : ',rpc.parseResponses(res)[0].response));

tiết lộ - Tôi là tác giả của bạch tuộc, và được xây dựng nếu vì một usecase tương tự của tôi, vì tôi không thể tìm thấy bất kỳ thư viện nhẹ nào.


0

Để biến "công cụ" thành một mô-đun, tôi không thấy khó khăn gì cả. Mặc dù tất cả các câu trả lời khác, tôi vẫn sẽ khuyên bạn nên sử dụng module.exports:

//util.js
module.exports = {
   myFunction: function () {
   // your logic in here
   let message = "I am message from myFunction";
   return message; 
  }
}

Bây giờ chúng tôi cần chỉ định xuất này cho phạm vi toàn cầu (trong ứng dụng của bạn | index | server.js)

var util = require('./util');

Bây giờ bạn có thể tham khảo và gọi chức năng như:

//util.myFunction();
console.log(util.myFunction()); // prints in console :I am message from myFunction 

-3

Sử dụng:

var mymodule = require("./tools.js")

app.js:

module.exports.<your function> = function () {
    <what should the function do>
}

1
Bạn gần như không bao giờ nên sử dụng một thư mục đầy đủ. Bạn nên cân nhắc sử dụng các đường dẫn tương đối như:./tools.js
Matthew D Auld
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.