ใน Node.js ฉันจะ "รวม" ฟังก์ชั่นจากไฟล์อื่น ๆ ของฉันได้อย่างไร?


967

สมมติว่าฉันมีไฟล์ชื่อ app.js. ค่อนข้างง่าย:

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);

ถ้าฉันมีฟังก์ชั่นอยู่ภายใน "tools.js" ฉันจะนำเข้าพวกเขาไปใช้ใน apps.js ได้อย่างไร

หรือ ... ฉันควรจะเปลี่ยน "เครื่องมือ" เป็นโมดูลแล้วต้องใช้หรือไม่ << ดูยากฉันค่อนข้างจะนำเข้าขั้นพื้นฐานของไฟล์ tools.js


4
สิ่งที่ทำให้ฉันออกจากที่นี่คือrequireการรวมโฟลเดอร์ในไดเรกทอรีเดียวกันบน Windows คุณได้มีการใช้ยูนิกซ์สไตล์ที่อยู่: แทนธรรมดาเก่า./mydir mydir
Ben

1
ฉันสร้างโมดูลเพื่อนำเข้าสคริปต์ส่งออกไปยังไฟล์และรวมโมดูลจากnode_modulesโฟลเดอร์ภายนอก npmjs.com/package/node-importหวังว่าจะสามารถช่วยได้ ขอบคุณ!
Nanang Mahdaen El-Agung

คำตอบ:


1415

คุณสามารถต้องการไฟล์ js ใด ๆ คุณเพียงแค่ต้องประกาศสิ่งที่คุณต้องการเปิดเผย

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

var zemba = function () {
}

และในไฟล์แอปของคุณ:

// 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 ทำได้ดีมากแม้จะ จำกัด รหัสที่นำเข้าไว้ในเนมสเปซของตัวเอง ฉันจะต้องจดบันทึกสิ่งนี้ไว้เพื่อใช้ในภายหลัง
Evan Plaice

8
ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะนำเข้าสคริปต์ภายนอก require("http://javascript-modules.googlecode.com/svn/functionChecker.js")ดูเหมือนจะไม่นำเข้าโมดูลอย่างถูกต้อง มีวิธีอื่นในการนำเข้าสคริปต์ภายนอกหรือไม่
Anderson Green

6
และถ้าฉันต้องส่งตัวแปรไปยังฟังก์ชั่น Like, bar: function (a, b) {// some code}
Nishutosh Sharma

5
เนื่องจากคุณกำลังเปิดเผยคุณสมบัติฉันจะใช้การส่งออกแทน module.exports สำหรับการส่งออก vs module.exports: stackoverflow.com/questions/5311334/…
ฟาร์ม

4
วิธีการเรียกใช้ฟังก์ชั่นบาร์ (), ฟังก์ชั่นภายใน foo () หมายถึงวิธีการเข้าถึงฟังก์ชั่นหนึ่งโดยใช้ฟังก์ชั่นอื่น
pitu

303

หากแม้จะมีคำตอบอื่น ๆ ทั้งหมดคุณยังคงต้องการรวมไฟล์ไว้ในไฟล์ต้นฉบับ node.js คุณสามารถใช้สิ่งนี้:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • การต่อสตริงว่างเปล่า +''นั้นจำเป็นต่อการรับเนื้อหาไฟล์เป็นสตริงและไม่ใช่วัตถุ (คุณสามารถใช้.toString()หากคุณต้องการ)
  • ไม่สามารถใช้ eval () ภายในฟังก์ชันและต้องเรียกใช้ภายในขอบเขตส่วนกลางมิฉะนั้นจะไม่มีการเข้าถึงฟังก์ชั่นหรือตัวแปร (เช่นคุณไม่สามารถสร้างinclude()ฟังก์ชั่นยูทิลิตี้หรืออะไรทำนองนั้น)

โปรดทราบว่าในกรณีส่วนใหญ่นี่เป็นวิธีปฏิบัติที่ไม่ดีและคุณควรเขียนโมดูลแทน อย่างไรก็ตามมีสถานการณ์ที่ไม่ค่อยเกิดขึ้นซึ่งมลพิษของบริบท / เนมสเปซในพื้นที่ของคุณคือสิ่งที่คุณต้องการ

อัปเดต 2015-08-06

โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับ"use strict";(เมื่อคุณอยู่ใน"โหมดเข้มงวด" ) เนื่องจากฟังก์ชั่นและตัวแปรที่กำหนดไว้ในไฟล์ "นำเข้า" ไม่สามารถเข้าถึงได้โดยรหัสที่นำเข้า โหมดเข้มงวดบังคับใช้กฎบางอย่างที่กำหนดโดยมาตรฐานภาษารุ่นใหม่กว่า นี่อาจเป็นอีกเหตุผลหนึ่งที่หลีกเลี่ยงวิธีการแก้ไขที่อธิบายไว้ที่นี่


41
เยี่ยมยอดสิ่งนี้มีประโยชน์สำหรับการวาง JS libs ที่รวดเร็วซึ่งออกแบบมาสำหรับฝั่งไคลเอ็นต์ลงในแอพ node.js โดยไม่จำเป็นต้องบำรุงรักษาส้อมแบบ Node
Kos

18
ฉันเพิ่งตอบคำถามเดิมซึ่งเกี่ยวกับการรวมรหัสไม่ได้เขียนโมดูล อดีตสามารถมีข้อได้เปรียบในบางสถานการณ์ นอกจากนี้ข้อสันนิษฐานของคุณเกี่ยวกับความต้องการนั้นไม่ถูกต้อง: รหัสนั้นมีวิวัฒนาการอย่างแน่นอน แต่มันยังคงอยู่ในเนมสเปซของตัวเองและไม่มีทางที่จะ "สร้างมลภาวะ" เนมสเปซของบริบทการโทรดังนั้นคุณต้อง eval () ในกรณีส่วนใหญ่การใช้วิธีการที่อธิบายไว้ในแอนเวอร์ของฉันเป็นการปฏิบัติที่ไม่ดีแต่ไม่ใช่ฉันที่ควรตัดสินใจว่าจะใช้กับ TIMEX หรือไม่
Udo G

14
@EvanPlaice: คุณมีข้อเสนอแนะที่ดีกว่าซึ่งตอบคำถามได้จริงหรือไม่? หากคุณต้องการรวมไฟล์ที่ไม่ใช่โมดูลคุณมีวิธีที่ดีกว่านี้หรือไม่?
jalf

8
บางครั้งมีเมื่อคุณต้องการรวมและบางครั้งต้องการพวกเขาเป็นสองแนวคิดที่แตกต่างกันในภาษาการเขียนโปรแกรมส่วนใหญ่โหนด JS เช่นกัน ความสามารถในการรวม js ไว้ในสถานที่ควรเป็นส่วนหนึ่งของ Node ที่จะซื่อสัตย์ แต่การประเมินว่าเป็นวิธีการแก้ปัญหาที่เหมาะสม upvoted
J. Martin

4
โปรดทราบว่าไม่เข้ากันกับการใช้แบบเข้มงวด - เนื่องจากการใช้แบบเข้มงวดจะเป็นการ จำกัด การใช้ eval โดยการบล็อกการแนะนำของตัวแปรใหม่ผ่านทาง eval ฯลฯ
timbo

189

คุณไม่จำเป็นต้องมีฟังก์ชั่นใหม่หรือโมดูลใหม่ คุณเพียงแค่ต้องดำเนินการโมดูลที่คุณโทรถ้าคุณไม่ต้องการใช้เนมสเปซ

ใน tools.js

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

ใน app.js

หรือใน. js อื่น ๆ เช่น myController.js:

แทน

var tools = require('tools.js') ซึ่งบังคับให้เราใช้เนมสเปซและเครื่องมือการโทรเช่น tools.sum(1,2);

เราสามารถโทร

require('tools.js')();

แล้ว

sum(1,2);

ในกรณีของฉันฉันมีไฟล์ที่มีตัวควบคุมctrls.js

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

และฉันสามารถใช้Categoriesในทุกบริบทเป็นคลาสสาธารณะหลังจากนั้นrequire('ctrls.js')()


12
สิ่งนี้ไม่มี +1 เพิ่มเติม นี่เป็นทางออกที่แท้จริงสำหรับคำถามที่ถาม (แม้ว่าจะไม่ใช่ 'เป็นทางการ') นอกจากนี้ยังสามารถดีบักได้ง่ายกว่าล้านครั้งกว่า eval () เนื่องจากโหนดสามารถให้ call stack ที่มีประโยชน์แทนการชี้ไปที่ไฟล์จริงแทนที่จะไม่ได้กำหนด
user3413723

5
โปรดทราบว่าคุณไม่สามารถ "ใช้" เข้มงวด "โหมดในโมดูลที่นำเข้า
David

1
@Nick Panov: ยอดเยี่ยม! มันควรจะมีค่าที่จะต้องทราบว่ามันใช้งานได้เพราะthisในฟังก์ชั่นเป็นขอบเขตทั่วโลกเมื่อฟังก์ชั่นถูกเรียกโดยตรง (ไม่ผูกพันในทางใดทางหนึ่ง)
Udo G

3
นี่เพิ่งเปลี่ยนชีวิตของฉันไม่มีเรื่องตลก - มีไฟล์บรรทัดมากกว่า 1,000 รายการที่ฉันไม่สามารถแยกย่อยได้เพราะตัวแปรของวิธีการที่แตกต่างกันมีความสัมพันธ์กันทั้งหมดและจะต้องมีความต้องการทั้งหมดในขอบเขตเดียวกัน ... require('blah.js')();ควร อนุญาตให้ฉันนำเข้าทั้งหมดในขอบเขตเดียวกัน !!! ขอบคุณ !!!
Sam Johnson

2
นี่เป็นเคล็ดลับที่ยอดเยี่ยม! ข้อแม้: ถ้าคุณประกาศฟังก์ชัน module.exports โดยใช้ () => {} ไวยากรณ์ทางลัดแทนการประกาศฟังก์ชั่นมาตรฐาน () {} มันล้มเหลว ใช้เวลาหนึ่งชั่วโมงในการพิจารณาว่าปัญหาอยู่ที่ไหน! (ฟังก์ชั่นลูกศรไม่มีคุณสมบัติ 'this' ของตนเอง: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

117

สร้างไฟล์ js สองไฟล์

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

ไฟล์ js หลัก

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

เอาต์พุตคอนโซล

Value: 30

js รุ่นใดใช้งานได้?
Mirv - Matt

39

นี่คือคำอธิบายที่ธรรมดาและเรียบง่าย:

เนื้อหา 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);

เนื้อหา 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

ผมยังมองหา NodeJS 'รวมถึง' ฟังก์ชั่นและฉันจะตรวจสอบการแก้ปัญหาที่เสนอโดยUdo G - เห็นข้อความhttps://stackoverflow.com/a/8744519/2979590 รหัสของเขาใช้ไม่ได้กับไฟล์ JS ที่รวมไว้ ในที่สุดฉันก็แก้ปัญหาเช่นนั้น:

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');

แน่นอนว่าช่วย


2
ฉันเข้าใจว่าแฮ็คน่าเกลียดขนาดนี้ แต่ช่วยฉันได้
lindhe

30

สร้างสองไฟล์เช่นapp.jsและtools.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
    }

เอาท์พุต

6
2

26

บอกว่าเราต้องการที่จะเรียกใช้ฟังก์ชันปิง ()และเพิ่ม (30,20)ซึ่งอยู่ในlib.jsไฟล์จาก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
ใช้งานได้ แต่เราไม่ควรใช้ไวยากรณ์โมดูลเมื่อรวมสคริปต์หรือไม่
Kokodoko

25

โมดูล vm ใน Node.js จัดเตรียมความสามารถในการเรียกใช้โค้ด JavaScript ภายในบริบทปัจจุบัน (รวมถึงอ็อบเจ็กต์โกลบอล) ดู http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_filename

โปรดทราบว่า ณ วันนี้มีข้อผิดพลาดในโมดูล vm ที่ป้องกันไม่ให้ runInThisContext ทำสิ่งที่ถูกต้องเมื่อเรียกใช้จากบริบทใหม่ สิ่งนี้สำคัญเฉพาะถ้าโปรแกรมหลักของคุณเรียกใช้โค้ดภายในบริบทใหม่จากนั้นโค้ดนั้นจะเรียกใช้ runInThisContext ดู https://github.com/joyent/node/issues/898

น่าเศร้าที่วิธีการ (ทั่วโลก) ที่เฟอร์นันโดแนะนำไม่ทำงานสำหรับฟังก์ชั่นที่ตั้งชื่อเช่น "function foo () {}"

กล่าวโดยย่อนี่คือฟังก์ชั่นรวม () ที่เหมาะกับฉัน:

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

ฉันพบ vm.runInThisContext ในคำตอบ SO อื่นและใช้มันเพื่อรวมไฟล์โค้ด "vanilla" Javascript อย่างไรก็ตามฉันพยายามใช้มันเพื่อรวมรหัสที่ขึ้นอยู่กับการใช้งานโหนด (เช่น "var fs = require ('fs')") และมันจะไม่ทำงาน อย่างไรก็ตามในกรณีดังกล่าวโซลูชัน "eval" ที่ระบุไว้ในคำตอบสองข้อนั้นใช้งานได้จริง
Dexygen

เมื่อคุณเริ่มต้องใส่รหัสที่ขึ้นอยู่กับการใช้งานโหนดอาจถึงเวลาต้องเขียนโมดูลแม้ว่าโซลูชัน eval อาจเป็นขั้นตอนแรกในกระบวนการนั้น
Dexygen

มีเพียงหนึ่งเดียวเท่านั้นที่ทำงานใน node.js ในปี 2019
meesern

13

Udo G. กล่าวว่า:

  • ไม่สามารถใช้ eval () ภายในฟังก์ชั่นและจะต้องเรียกใช้ภายในขอบเขตส่วนกลางมิฉะนั้นจะไม่มีการเข้าถึงฟังก์ชั่นหรือตัวแปร (เช่นคุณไม่สามารถสร้างฟังก์ชันยูทิลิตี้ include () หรืออะไรทำนองนั้น)

เขาพูดถูก แต่ก็มีวิธีที่จะส่งผลกระทบต่อขอบเขตทั่วโลกจากฟังก์ชั่น ปรับปรุงตัวอย่างของเขา:

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

include('somefile_with_some_declarations.js');

// the declarations are now accessible here.

หวังว่าจะช่วย


12

มันทำงานร่วมกับฉันชอบต่อไปนี้ ....

Lib1.js

//Any other private code here 

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

// Again any private code

ตอนนี้ในไฟล์Main.jsคุณต้องรวมLib1.js

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

โปรดจำไว้ว่าจะนำ Lib1.js ในโฟลเดอร์ node_modules


11

คุณสามารถใส่ฟังก์ชั่นของคุณในตัวแปรระดับโลกได้ แต่ควรเปลี่ยนสคริปต์เครื่องมือของคุณให้เป็นโมดูล ไม่ยากเกินไป - เพียงแนบ API สาธารณะของคุณกับexportsวัตถุ ดูที่โมดูลการส่งออกของการทำความเข้าใจ Node.jsเพื่อดูรายละเอียดเพิ่มเติม


1
ตัวอย่างนั้นดีกว่าลิงก์
tno2007

11

อีกวิธีในการทำเช่นนี้ในความคิดของฉันคือการดำเนินการทุกอย่างในไฟล์ lib เมื่อคุณเรียกใช้ฟังก์ชั่นrequire () ( (ฟังก์ชั่น (/ * สิ่งที่นี่ * /) {}) (); การทำเช่นนี้จะทำให้ฟังก์ชั่นเหล่านี้ครอบคลุมขอบเขตทั่วโลกเหมือนกับ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');
            }
    }
})();

แล้วในรหัสหลักของคุณคุณสามารถเรียกฟังก์ชั่นของคุณตามชื่อเช่น:

main.js

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

จะทำให้ผลผลิตนี้

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

จ่าย Atention ไปไม่ได้กำหนดเมื่อคุณเรียกฉันobject.funcFour ()มันจะเหมือนกันถ้าคุณโหลดกับEVAL () หวังว่าจะช่วย :)


10

ผมแค่อยากจะเพิ่มในกรณีที่คุณต้องการฟังก์ชั่นบางอย่างเพียงแค่นำเข้าจากคุณtools.jsแล้วคุณสามารถใช้การกำหนด destructuringซึ่งได้รับการสนับสนุนใน Node.js ตั้งแต่รุ่น6.4 - ดูnode.green


ตัวอย่าง : (ไฟล์ทั้งสองอยู่ในโฟลเดอร์เดียวกัน)

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));

เอาท์พุท: true


นอกจากนี้ยังหลีกเลี่ยงที่คุณกำหนดหน้าที่เหล่านั้นเป็นคุณสมบัติของวัตถุอื่นเป็นกรณีในการกำหนด (ทั่วไป) ต่อไปนี้:

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

tools.isEven(10)ที่คุณจำเป็นต้องโทร


บันทึก:

อย่าลืมนำหน้าชื่อไฟล์ด้วยพา ธ ที่ถูกต้อง - แม้ว่าไฟล์ทั้งสองจะอยู่ในโฟลเดอร์เดียวกันคุณจะต้องนำหน้าด้วย ./

จากNode.js เอกสาร :

หากไม่มีส่วนนำหน้า '/', './' หรือ '../' เพื่อระบุไฟล์โมดูลนั้นต้องเป็นโมดูลหลักหรือโหลดจากโฟลเดอร์ 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

รวมไฟล์และรันในบริบทที่กำหนด (ไม่ใช่สากล)

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

นี่เป็นวิธีที่ดีที่สุดที่ฉันได้สร้างขึ้น

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();

คุณยังต้องแจ้งสิ่งที่คุณต้องการส่งออก

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

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

Lara.prototype.webServer = null;

module.exports.Lara = Lara;

2

เหมือนคุณกำลังมีไฟล์อยู่ abc.txtและอีกมากมาย?

สร้าง 2 ไฟล์: fileread.jsและfetchingfile.jsจากนั้นในการfileread.jsเขียนรหัสนี้:

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());
}

ในการfetchingfile.jsเขียนรหัสนี้:

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());

ตอนนี้ในเทอร์มินัล: $ node fetchingfile.js --file = abc.txt

คุณกำลังส่งชื่อไฟล์เป็นอาร์กิวเมนต์รวมถึงไฟล์ทั้งหมดใน readfile.jsแทนที่จะส่งผ่าน

ขอบคุณ


2

คุณสามารถทำได้ง่ายเพียง require('./filename')คุณก็สามารถที่เรียบง่าย

เช่น.

// 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;

โปรดทราบว่า:

  1. คุณไม่สามารถฟัง PORT ในไฟล์ย่อยได้มีเพียงโมดูล Express parent เท่านั้นที่มีฟัง PORT
  2. เด็กใช้ 'เราเตอร์' ไม่ใช่ parent moudle

1

ฉันก็เช่นกันค้นหาตัวเลือกที่จะรวมรหัสโดยไม่ต้องเขียนโมดูลตอบ ใช้แหล่งข้อมูลเดี่ยวที่ทดสอบแล้วจากโครงการอื่นสำหรับบริการ Node.js และคำตอบของjmparatteก็ทำเพื่อฉัน

ประโยชน์คือคุณไม่สร้างมลภาวะในเนมสเปซฉันไม่มีปัญหา"use strict";และทำงานได้ดี

นี่คือตัวอย่างเต็มรูปแบบ :

สคริปต์ที่จะโหลด - /lib/foo.js

"use strict";

(function(){

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

    Foo.prototype.x = 1;

    return Foo;

}())

SampleModule - 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'
    }

}

หวังว่านี่จะเป็นประโยชน์อย่างใด


1

อีกวิธีหนึ่งเมื่อใช้เฟรมเวิร์ก node.js และ express.js

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

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

เก็บสิ่งนี้ในไฟล์ js ชื่อ s และในโฟลเดอร์สถิต

ตอนนี้ใช้ฟังก์ชั่น

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

1

ฉันได้วิธีที่ค่อนข้างหยาบในการจัดการสิ่งนี้สำหรับเทมเพลต HTML เช่นเดียวกับ 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>

โหลดหน้าผลลัพธ์แล้ว

<!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

หากคุณต้องการใช้ประโยชน์จากสถาปัตยกรรมซีพียูและไมโครบริการหลายอย่างเพื่อเพิ่มความเร็วให้ ... ใช้ RPC แทนกระบวนการแบบแยก

ฟังดูซับซ้อน แต่ก็ง่ายถ้าคุณใช้ปลาหมึกยักษ์ปลาหมึก

นี่คือตัวอย่าง:

ใน tools.js เพิ่ม:

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;
});

บน app.js เพิ่ม:

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));

การเปิดเผย - ฉันเป็นผู้เขียนปลาหมึกยักษ์และสร้างขึ้นเพื่อการใช้งานที่คล้ายกันของฉันเนื่องจากฉันไม่สามารถหาไลบรารี่ที่มีน้ำหนักเบาได้


0

ในการเปลี่ยน "เครื่องมือ" เป็นโมดูลฉันไม่เห็นอะไรเลย แม้จะมีคำตอบอื่น ๆ ทั้งหมดฉันยังคงแนะนำให้ใช้ module.exports:

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

ตอนนี้เราต้องกำหนดการส่งออกนี้ให้กับขอบเขตทั่วโลก (ในแอพของคุณ | ดัชนี | server.js)

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

ตอนนี้คุณสามารถอ้างอิงและเรียกใช้ฟังก์ชันเป็น:

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

-3

ใช้:

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

app.js:

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

1
คุณไม่ควรใช้ไดเรกทอรีแบบเต็ม คุณควรพิจารณาใช้เส้นทางสัมพัทธ์เช่น:./tools.js
Matthew D Auld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.