নোড.জেজে, আমি কীভাবে আমার অন্যান্য ফাইলগুলি থেকে "অন্তর্ভুক্ত" করব?


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

"সরঞ্জাম.js" এর ভিতরে যদি আমার কোনও ফাংশন থাকে তবে কী হবে। আমি কীভাবে সেগুলিকে অ্যাপস.জেজেস ব্যবহার করতে আমদানি করব?

বা ... আমার কি "সরঞ্জামগুলি" একটি মডিউলে রূপান্তরিত করার কথা আছে, এবং তারপরে এটির প্রয়োজন? << শক্ত মনে হচ্ছে, আমি বরং টুলস.জেএস ফাইলের মূল আমদানি করি।


4
যা আমাকে এখানে ফেলেছিল তা requireউইন্ডোজের একই ডিরেক্টরিতে একটি ফোল্ডার ইনগ্রেট করছিল । আপনি ইউনিক্স-শৈলী ঠিকানা ব্যবহার করতে হবে: ./mydirসাধারণ পুরানো পরিবর্তে mydir
বেন

1
আমি স্ক্রিপ্টগুলি আমদানি করতে, ফাইলগুলিতে রফতানি করতে এবং বাইরের node_modulesফোল্ডার থেকে মডিউল অন্তর্ভুক্ত করার জন্য একটি মডিউল তৈরি করেছি । npmjs.com/package/node-portort আশা করি এটি সহায়তা করতে পারে। ধন্যবাদ!
নানং মাহদেন এল-আগুং

উত্তর:


1414

আপনার যে কোন জেএস ফাইলের প্রয়োজন হতে পারে, আপনি কেবল প্রকাশ করতে চান তা আপনাকে প্রকাশ করতে হবে।

// 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 ভালভাবে সম্পন্ন হয়েছে, এমনকি আমদানিকৃত কোডটিকে তার নিজের নামের জায়গাতেই সীমাবদ্ধ রাখে। আমি পরে এটির জন্য একটি নোট করতে হবে।
ইভান প্লেস

8
আমি আশ্চর্য হই যে বাহ্যিক স্ক্রিপ্টগুলি আমদানি করা সম্ভব কিনা। require("http://javascript-modules.googlecode.com/svn/functionChecker.js")মডিউলটি সঠিকভাবে আমদানি করে বলে মনে হচ্ছে না। বাহ্যিক স্ক্রিপ্টগুলি আমদানির জন্য অন্য কোনও উপায় আছে?
অ্যান্ডারসন সবুজ

6
এবং যদি আমাকে ফাংশনে লাইক, বার: ফাংশন (ক, খ) {// কিছু কোড
into

5
যেহেতু আপনি বৈশিষ্ট্যগুলি প্রকাশ করছেন আমি মডিউল.এক্সপোর্টগুলির পরিবর্তে রফতানি ব্যবহার করব। : রপ্তানির module.exports বনাম জন্য stackoverflow.com/questions/5311334/...
কৃষি

4
foo () ফাংশনের ভিতরে কীভাবে ফাংশন বার () কল করবেন তার অর্থ কীভাবে অন্য ফাংশনটির সাথে একটি ফাংশন অ্যাক্সেস করা যায়
পিটু

303

যদি, অন্যান্য সমস্ত উত্তর সত্ত্বেও, আপনি এখনও একটি নোড.জেএস উত্স ফাইলটিতে tradition তিহ্যগতভাবে কোনও ফাইল অন্তর্ভুক্ত করতে চান , আপনি এটি ব্যবহার করতে পারেন:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • স্ট্রিং +''হিসাবে ফাইলের সামগ্রী পাওয়ার জন্য খালি স্ট্রিং কনটেনটেশন প্রয়োজনীয় এবং কোনও বস্তু নয় (আপনি .toString()যদি চান তবে আপনি এটিও ব্যবহার করতে পারেন )।
  • ইভাল () কোনও ফাংশনের অভ্যন্তরে ব্যবহার করা যাবে না এবং অবশ্যই তাকে বিশ্বব্যাপী স্কোপের অভ্যন্তরে ডেকে আনতে হবে অন্যথায় কোনও ফাংশন বা ভেরিয়েবল অ্যাক্সেসযোগ্য হবে না (যেমন আপনি কোনও include()ইউটিলিটি ফাংশন বা এর মতো কিছু তৈরি করতে পারবেন না )।

দয়া করে নোট করুন যে বেশিরভাগ ক্ষেত্রে এটি খারাপ অভ্যাস এবং পরিবর্তে আপনার একটি মডিউল লেখা উচিত । তবে, এমন বিরল পরিস্থিতি রয়েছে, যেখানে আপনার স্থানীয় প্রসঙ্গ / নেমস্পেসের দূষণ হ'ল আপনি যা চান তা সত্য।

আপডেট 2015-08-06

দয়া করে মনে রাখবেন এটি "use strict";(যখন আপনি "কঠোর মোডে থাকবেন " ) এর সাথে কাজ করবে না কারণ "আমদানি" ফাইলের মধ্যে সংজ্ঞায়িত ফাংশন এবং ভেরিয়েবলগুলি যে আমদানি করে তাতে কোড অ্যাক্সেস করতে পারে না । কঠোর মোড ভাষা স্ট্যান্ডার্ডের নতুন সংস্করণ দ্বারা সংজ্ঞায়িত কিছু বিধি প্রয়োগ করে। এখানে বর্ণিত সমাধান এড়াতে এটি অন্য কারণ হতে পারে


41
শীতল, নোড-স্টাইলযুক্ত কাঁটাচামচ রক্ষণাবেক্ষণ ছাড়াই ক্লায়েন্ট-সাইডের জন্য নকশা করা জেএস লিবিকে নোড.জেএস অ্যাপ্লিকেশনে রেখে দেওয়ার জন্য এটি দরকারী।
কোস

18
আমি কেবলমাত্র মূল প্রশ্নের উত্তর দিয়েছি, যা কোড সহ মডিউল লেখার বিষয়ে নয়। সাবেক পারেন নির্দিষ্ট পরিস্থিতিতে সুবিধা আছে। এছাড়াও প্রয়োজনীয়তা সম্পর্কে আপনার ধারণাটি ভুল: কোডটি অবশ্যই স্পষ্টরূপে রয়েছে, তবে এটি নিজস্ব নামস্থানে থেকেই যায় এবং কলিং প্রসঙ্গে "দূষিত" করার কোনও উপায় নেই, সুতরাং আপনাকে নিজেই এটি প্রকাশ করতে হবে ()। বেশিরভাগ ক্ষেত্রে আমার অ্যাওয়ারে বর্ণিত পদ্ধতিটি ব্যবহার করা খারাপ অভ্যাস তবে এটি আমার নয় যে এটি টিমেক্সের জন্য কিনা তা সিদ্ধান্ত নেওয়া উচিত।
উদো জি

14
@ ইভানপ্লাইস: আপনার কাছে আরও ভাল পরামর্শ আছে যা প্রশ্নের উত্তরটি আসলে দেয় ? আপনার যদি এমন কোনও ফাইল অন্তর্ভুক্ত করতে হয় যা মডিউল নয় তবে আপনার কি এর চেয়ে আরও ভাল পদ্ধতির দরকার?
জাল্ফ

8
কখনও কখনও যখন আপনার অন্তর্ভুক্ত প্রয়োজন হয় এবং কখনও কখনও প্রয়োজন হয়, সেগুলি বেশিরভাগ প্রোগ্রামিং ভাষায় দুটি মূল ধারণা, নোড জেএসও হয়। জেএসকে স্থানে অন্তর্ভুক্ত করার ক্ষমতাটি নোডের একটি অংশ হওয়া উচিত সততার সাথে, তবে এটি বিশ্লেষণ করা মূলত একটি শালীন সমাধান। সম্মত।
জে মার্টিন

4
দ্রষ্টব্য যে ব্যবহারটি কঠোরভাবে ব্যবহারের সাথে বেমানান - যেমন কঠোরভাবে ব্যবহারের ফলে
ইওল

189

আপনার কোনও নতুন ফাংশন বা নতুন মডিউলগুলির প্রয়োজন নেই। যদি আপনি নাম স্থানটি ব্যবহার করতে না চান তবে আপনাকে কেবল যে মডিউলটি কল করছেন তা কার্যকর করতে হবে।

সরঞ্জাম.জেএস এ

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

app.js এ

বা অন্য কোনও .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 নেই? প্রশ্নটি যা জিজ্ঞাসা করে তার এটিই একটি আসল সমাধান (যদিও 'আধিকারিক' নয়)। এওল () এর চেয়ে ডিবাগ করাও মিলিয়ন গুণ সহজ কারণ নোড কেবল অপরিজ্ঞাত না হয়ে আসল ফাইলটির দিকে ইঙ্গিত করে একটি দরকারী কল স্ট্যাক দিতে পারে।
ব্যবহারকারী 3413723

5
নোট করুন যে আপনি আমদানি করা মডিউলটিতে "কঠোর" মোড ব্যবহার করতে পারবেন না।
ডেভিড

1
@ নিক পানোভ: উজ্জ্বল! এটি লক্ষ করা উচিত যে এটি কাজ করে কারণ thisএকটি ফাংশনটিতে বিশ্বব্যাপী সুযোগ হয় যখন ফাংশনটি সরাসরি বলা হয় (কোনওভাবে আবদ্ধ নয়)।
উদো জি

3
এই মাত্র আমার জীবন, কোন রসিকতা পরিবর্তিত - একটি 1000+ লাইন ফাইলের সংখ্যা যেগুলিতে আমার ভেঙ্গে করতে পারে না কারণ বিভিন্ন পদ্ধতি ভেরিয়েবল সব আন্ত সম্পর্ক এবং একই সুযোগ সব করা প্রয়োজন হবে ছিল ... require('blah.js')();উচিত আমাকে এগুলি একই স্কোপে আমদানি করার অনুমতি দিন !!! ধন্যবাদ !!!
স্যাম জনসন

2
এটি একটি মহান টিপ! সাবধানতা: আপনি যদি স্ট্যান্ডার্ড ফাংশন ()}} ঘোষণার পরিবর্তে () => {} শর্টকাট সিনট্যাক্স ব্যবহার করে মডিউল.এক্সপোর্টগুলি ফাংশন ঘোষণা করেন তবে এটি ব্যর্থ হয়। সমস্যাটি কোথায় ছিল তা বোঝার জন্য আমাকে এক ঘন্টা সময় নিয়েছে! (তীর ফাংশনগুলির নিজস্ব 'এই' সম্পত্তি নেই: বিকাশকারী.মোজিলা.আর.ইন.ইউএস /
ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স /…

117

দুটি জেএস ফাইল তৈরি করুন

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

মেইন জেএস ফাইল

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

কনসোল আউটপুট

Value: 30

এই জেএস এর কোন সংস্করণ কাজ করে?
মিরভ - ম্যাট

39

এখানে একটি সরল এবং সাধারণ ব্যাখ্যা:

সার্ভার.জেএস সামগ্রী:

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

সহায়ক.জেএস এর সামগ্রী:

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

আমি একটি নোডজেএস 'অন্তর্ভুক্ত' ফাংশনটিও খুঁজছিলাম এবং আমি ইউডো জি দ্বারা প্রস্তাবিত সমাধানটি পরীক্ষা করেছিলাম - বার্তাটি দেখুন https://stackoverflow.com/a/8744519/2979590 । তার কোডটি আমার অন্তর্ভুক্ত জেএস ফাইলগুলির সাথে কাজ করে না। অবশেষে আমি সমস্যার মতো সমাধান করেছি:

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) যুক্ত করতে চাই যা মূল. js থেকে lib.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
এটি কাজ করে, তবে স্ক্রিপ্টগুলি অন্তর্ভুক্ত করার সময় আমাদের কী মডিউলগুলি সিনট্যাক্স ব্যবহার করার কথা নয়?
কোকোডোকো

25

নোড.জেজে থাকা ভিএম মডিউল বর্তমান প্রসঙ্গে (গ্লোবাল অবজেক্ট সহ) জাভাস্ক্রিপ্ট কোড চালানোর ক্ষমতা সরবরাহ করে। Http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_filename দেখুন

মনে রাখবেন যে, আজকের মতো, ভিএম মডিউলে একটি বাগ রয়েছে যা নতুন প্রসঙ্গ থেকে আহ্বান করার সময় রানআইনটিস কনটেক্সটকে সঠিক কাজ করতে বাধা দেয়। এটি কেবল তখনই গুরুত্বপূর্ণ যখন আপনার মূল প্রোগ্রামটি একটি নতুন প্রসঙ্গে কোড সম্পাদন করে এবং তারপরে সেই কোডটি রানইনথিস কনটেক্সট কল করে। Https://github.com/joyent/node/issues/898 দেখুন

দুঃখের বিষয়, ফার্নান্দো যে "বিশ্বব্যাপী" পদ্ধতির পরামর্শ দিয়েছিল "ফাংশন ফু () {}" এর মতো নামকৃত ফাংশনগুলির জন্য কাজ করে না

সংক্ষেপে, এখানে একটি অন্তর্ভুক্ত () ফাংশন যা আমার পক্ষে কাজ করে:

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

আমি অন্য এসও উত্তরে vm.runInThisContext খুঁজে পেয়েছি এবং "ভ্যানিলা" জাভাস্ক্রিপ্ট কোড ফাইলগুলি অন্তর্ভুক্ত করার জন্য এটি ব্যবহার করে চলেছি। তবে তবে আমি কোডটি নোড কার্যকারিতা (যেমন "var fs = প্রয়োজনীয় ('fs')") এর উপর নির্ভর করে অন্তর্ভুক্ত করার জন্য এটি ব্যবহার করার চেষ্টা করেছি এবং এটি কার্যকর হবে না। তবে সেই ক্ষেত্রে, "ইভাাল" সমাধান (গুলি) বেশ কয়েকটি উত্তরে উল্লিখিত হয়েছে, তা বাস্তবে কার্যকর হয়।
অক্সিজেন

আরও কিছুটা চিন্তা করে আপনি যখন নোড কার্যকারিতার উপর নির্ভরশীল কোড অন্তর্ভুক্ত করার প্রয়োজন শুরু করবেন তখন সম্ভবত মডিউলটি লেখার সময় এসেছে, যদিও
এভ্যাল সলিউশন

2019 এ শুধুমাত্র
নোড.জেজে

13

উদো জি বলেছেন:

  • ইভাল () কোনও ফাংশনের অভ্যন্তরে ব্যবহার করা যাবে না এবং অবশ্যই তাকে বিশ্বব্যাপী স্কোপের অভ্যন্তরে ডেকে আনতে হবে অন্যথায় কোনও ফাংশন বা ভেরিয়েবল অ্যাক্সেসযোগ্য হবে না (যেমন আপনি একটি অন্তর্ভুক্ত () ইউটিলিটি ফাংশন বা এর মতো কিছু তৈরি করতে পারবেন না)।

তিনি ঠিক বলেছেন, তবে একটি ফাংশন থেকে বৈশ্বিক সুযোগকে প্রভাবিত করার একটি উপায় আছে। তার উদাহরণটি উন্নত করা:

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

এখন মেইন.জেএস ফাইলটিতে আপনাকে লিবি 1.জেএস অন্তর্ভুক্ত করতে হবে

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

মনে রাখবেন Lib1.js নোড_মডিউল ফোল্ডারে রাখবেন


11

আপনি আপনার ফাংশনগুলিকে বৈশ্বিক চলকগুলিতে রাখতে পারেন তবে কেবলমাত্র আপনার সরঞ্জাম স্ক্রিপ্টকে একটি মডিউলে রূপান্তর করা আরও ভাল অনুশীলন। এটি সত্যই খুব বেশি কঠিন নয় - কেবলমাত্র আপনার সর্বজনীন এপিআইটিকে exportsবস্তুর সাথে সংযুক্ত করুন । কটাক্ষপাত বোঝাপড়া Node.js 'রপ্তানির মডিউল আরো কিছু বিবরণের জন্য।


1
উদাহরণটি একটি লিঙ্কের চেয়ে ভাল
tno2007

11

আরেকটি উপায় আমার মতে এই কাজ করতে, liberal এর সংক্ষিপ্ত রূপ ফাইলে সবকিছু চালানো যখন আপনি কল () প্রয়োজন ফাংশন ব্যবহার করে (ফাংশন (/ * এখানে কিছু * /) {}) (); এটি করার ফলে এই সমস্ত ক্রিয়াকলাপটি বিশ্বব্যাপী সুযোগ তৈরি করবে, ঠিক যেমন ইওল () সমাধানের মতো

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

দিতে মনোযোগ অনির্ধারিত যখন আপনি আমার কল object.funcFour () , যদি আপনার সাথে লোড একই হবে Eval () । আশা করি এটা সাহায্য করবে :)


10

আমি কেবল যুক্ত করতে চাই, যদি আপনার সরঞ্জামগুলির থেকে আমদানি করা নির্দিষ্ট ফাংশনগুলির প্রয়োজন হয় , তবে আপনি একটি কাঠামোগত অ্যাসাইনমেন্ট ব্যবহার করতে পারেন যা সংস্করণ 6.৪ থেকে নোড.জেএসগুলিতে সমর্থিত - নোড . 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)


বিঃদ্রঃ:

আপনার ফাইলের নামটিকে সঠিক পথ দিয়ে উপসর্গ করতে ভুলবেন না - এমনকি উভয় ফাইল একই ফোল্ডারে থাকলেও আপনাকে উপসর্গের প্রয়োজন ./

নোড.জেএস ডক্স থেকে :

কোনও ফাইল চিহ্নিত করার জন্য নেতৃস্থানীয় '/', './', বা '../' ছাড়াই মডিউলটি মূল মডিউল হতে হবে বা নোড_মডিউলগুলি ফোল্ডার থেকে লোড করা উচিত।


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

এখন, একটি টার্মিনালে: ode নোড 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. আপনি চাইল্ড ফাইলে পোর্টটি শুনতে পারবেন না, কেবল প্যারেন্ট এক্সপ্রেস মডিউলেই পোর্ট শ্রোতা রয়েছে
  2. শিশু 'রাউটার' ব্যবহার করছে, অভিভাবক এক্সপ্রেস মুডল নয়।

1

আমি পাশাপাশি মডিউল, রেস না লিখে কোড অন্তর্ভুক্ত করার জন্য একটি বিকল্প অনুসন্ধান করছিলাম। নোড.জেএস সার্ভিসের জন্য আলাদা প্রকল্পের একই পরীক্ষিত স্ট্যান্ডেলোন উত্সগুলি ব্যবহার করুন - এবং জম্পারেটের উত্তর এটি আমার জন্য করেছিল।

সুবিধাটি হ'ল, আপনি নাম স্থানটি কলুষিত করবেন না, আমার কোনও সমস্যা নেই "use strict";এবং এটি ভালভাবে কাজ করে।

এখানে একটি সম্পূর্ণ নমুনা:

স্ক্রিপ্ট লোড করার জন্য - /lib/foo.js

"use strict";

(function(){

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

    Foo.prototype.x = 1;

    return Foo;

}())

স্যাম্পলমডিউল - 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

নোড.জেএস এবং এক্সপ্রেস.জেএস ফ্রেমওয়ার্ক ব্যবহার করার সময় অন্য একটি পদ্ধতি

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

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

এটি নামের একটি জেএস ফাইল এবং ফোল্ডার স্ট্যাটিক্সে সঞ্চয় করুন

এখন ফাংশন ব্যবহার করতে

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

1

আমি এইচটিএমএল টেম্প্লেটিংয়ের জন্য এটি পরিচালনা করার পরিবর্তে অপরিশোধিত পদ্ধতি নিয়ে এসেছি। একইভাবে পিএইচপি<?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

যদি আপনি একাধিক সিপিইউস এবং মাইক্রোসার্ভিস আর্কিটেকচারের সুবিধা গ্রহণ করতে চান তবে জিনিসগুলিকে গতি বাড়িয়ে তুলুন ... কাঁটাযুক্ত প্রক্রিয়াগুলিতে আরপিসি ব্যবহার করুন।

জটিল মনে হচ্ছে তবে আপনি যদি অক্টোপাস ব্যবহার করেন তবে এটি সহজ

এখানে একটি উদাহরণ:

সরঞ্জাম.জেজে যোগ করুন:

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

"সরঞ্জামগুলি" মডিউলে রূপান্তর করতে, আমি মোটেও দেখতে পাচ্ছি না। অন্যান্য সমস্ত উত্তর থাকা সত্ত্বেও আমি এখনও মডিউল.এক্সপোর্টগুলি ব্যবহারের পরামর্শ দেব:

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

এখন আমাদের এই রফতানি বিশ্বব্যাপী সুযোগের জন্য বরাদ্দ করতে হবে (আপনার অ্যাপ্লিকেশন | ইনডেক্স | সার্ভার.জেজে)

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
ম্যাথিউ ডি অল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.