স্থানীয় ভেরিয়েবল অ্যাক্সেস সহ node.js এ বাহ্যিক js ফাইলটি লোড করুন এবং সম্পাদন করবেন?


130

include('./path/to/file')নোড.জেএসে কোনও সাধারণ ধরণের কমান্ড করা কি সহজ / সম্ভব ?

আমি যা করতে চাই তা হ'ল স্থানীয় ভেরিয়েবল অ্যাক্সেস এবং স্ক্রিপ্ট চালানো। সাধারণ হ্যালো ওয়ার্ল্ডের চেয়ে বড় লোকেরা সাধারণত নোড.জেএস প্রকল্পগুলি কীভাবে সংগঠিত করে? (একটি সম্পূর্ণ কার্যকরী গতিশীল ওয়েবসাইট)

উদাহরণস্বরূপ, আমি যেমন ডিরেক্টরি থাকতে চাই:

/models

/views

... ইত্যাদি


বাহ্যিক URL (স্থানীয় ফাইলের পরিবর্তে) থেকে কোনও স্ক্রিপ্ট অন্তর্ভুক্ত করাও সম্ভব। এখানে দেখুন: পেস্টবিন.com
অ্যান্ডারসন সবুজ

উপরের স্ক্রিপ্টটি কেবলমাত্র সঠিকভাবে কাজ করে যদি আপনি downloadedModulesস্ক্রিপ্ট হিসাবে একই ডিরেক্টরিতে বলা একটি ফোল্ডার তৈরি করেন।
অ্যান্ডারসন সবুজ

উত্তর:


134

শুধু একটি require('./yourfile.js');

আপনি যে সমস্ত ভেরিয়েবলকে বহিঃস্থ ভেরিয়েবল হিসাবে অ্যাক্সেস চান তা ঘোষণা করুন। পরিবর্তে তাই

var a = "hello" এটা হবে

GLOBAL.a="hello" বা শুধু

a = "hello"

এটা অবশ্যই খারাপ। আপনি বৈশ্বিক সুযোগকে দূষিত করতে চান না। পরিবর্তে পরামর্শ পদ্ধতিটি exportআপনার ফাংশন / ভেরিয়েবলের কাছে।

আপনি যদি এমভিসি প্যাটার্ন চান তবে গেডিকে একবার দেখুন।


3
পার্শ্ব নোট হিসাবে .. আমি এক্সপ্রেস ভালবাসি। আপনার যদি এটি এমভিসি সম্পর্কে নির্দিষ্ট না থাকে তবে আপনার এটিও পরীক্ষা করা উচিত।
শ্রীপদ ​​কৃষ্ণ

42
আপনি যখন বলেন "এটি স্পষ্টতই খারাপ", "এটি" কী বোঝায়?
অ্যান্ডারসন গ্রিন

1
@ অ্যান্ডারসগ্রিন - তার অর্থ বৈশ্বিক সুযোগে পরিবর্তনশীল স্থাপন করা।
টিম

77
@ অ্যান্ডারসগ্রিন: দয়া করে আমাকে বলুন যে স্কোপিং সম্পর্কে অত্যন্ত চতুর রসিকতা ছিল ;-)
ডাস্টি জে

6
এটি আমাকে শিখতে সহায়তা করেছে যে requireআপনি যদি আপনার পথের উপস্থাপন না করেন তবে আপনার এনপিএম মডিউলগুলির মধ্যে এমনটি দেখা যায়./
ডিলান ভ্যালাদ

93

আপনার কমনজেএস বুঝতে হবে যা মডিউলগুলি সংজ্ঞায়িত করার এক ধরণ। আপনি গ্লোবাল স্কোপটি অপব্যবহার করবেন না যা করা সর্বদা খারাপ কাজ নয়, পরিবর্তে আপনি 'রফতানি' টোকেনটি ব্যবহার করতে পারেন:

// circle.js

var PI = 3.14; // PI will not be accessible from outside this module

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

এবং ক্লায়েন্ট কোড যা আমাদের মডিউলটি ব্যবহার করবে:

// client.js

var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

এই কোডটি নোড.জেএস ডকুমেন্টেশন এপিআই থেকে নেওয়া হয়েছিল:

http://nodejs.org/docs/v0.3.2/api/modules.html

এছাড়াও, আপনি যদি রেলস বা সিনট্রা জাতীয় কিছু ব্যবহার করতে চান তবে আমি এক্সপ্রেসের প্রস্তাব দিই (স্ট্রিং ওভারফ্লোতে আমি ইউআরএল পোস্ট করতে পারছি না!)


64

আপনি যদি নোডের জন্য কোড লিখছেন, ইভানের বর্ণিত নোড মডিউলগুলি ব্যবহার করা কোনও সন্দেহ ছাড়াই যাওয়ার উপায়।

তবে আপনার যদি জাভাস্ক্রিপ্টটি লোড করতে হয় যা ইতিমধ্যে লিখিত হয়েছে এবং নোড সম্পর্কে অবগত নয়, vmমডিউলটি সেই উপায় (এবং অবশ্যই এটি পছন্দনীয় eval)।

উদাহরণস্বরূপ, এখানে আমার execfileমডিউল রয়েছে, যা স্ক্রিপ্টটিকে pathউভয় contextবা বৈশ্বিক প্রসঙ্গে মূল্যায়ন করে:

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
}

আরও মনে রাখবেন: লোডযুক্ত মডিউলগুলির require(…)বৈশ্বিক প্রসঙ্গে অ্যাক্সেস নেই।


1
এই পরামর্শের জন্য আপনাকে ধন্যবাদ। আসল ব্যবহারের ক্ষেত্রে যখন আপনাকে মডিউল অ্যাডহক লোড করতে হয়। রেজিস্ট্রেশন প্যাটার্নগুলির মতো বলুন যেখানে আপনার 1000 টি মডিউল থাকবে যা কোনও পরিষেবাতে নিবন্ধভুক্ত। মডিউলগুলির জন্য স্ক্যান করা এবং আপনার সেবার 1000 টি বিবৃতি দেওয়ার চেয়ে একে একে লোড করা এটি অনেক বেশি পরিচ্ছন্ন এবং উন্নত ডিজাইন ...
আসফ মোলডাভস্কি

নোড গতিশীল প্রয়োজন সমর্থন করে, তাই নোড-সচেতন মডিউলগুলি গতিশীলভাবে লোড করার সময় এই প্যাটার্নটি ব্যবহার করার কোনও কারণ নেই। প্রকৃতপক্ষে, এটি ব্যবহারের জন্য এটি সক্রিয়ভাবে ক্ষতিকারক, যেহেতু এটি নোডকে ছাড়িয়ে যায় require.cacheতাই একক ফাইল একাধিকবার লোড হতে পারে।
ডেভিড ওলবার

ঠিক আছে, তাই আমি যে কেসটি উপস্থাপন করেছি সেখানে এটি সমাধান করার জন্য যেখানে আপনার একটি 1000 মডিউল রয়েছে যেখানে প্রতিটি একটি রেজিস্ট্রি পরিষেবাদিতে নিবন্ধভুক্ত হয়, আপনি কী 1000 ব্যবহার না করে প্রস্তাবিত যা ব্যবহার করবেন রেজিস্ট্রি পরিষেবাতে বিবৃতি প্রয়োজন?
আসফ মোলডাভস্কি

1
ঠিক requireসাধারণের মতো: function loadService(name) { return require('./services/' + name); }তারপরে পরিষেবাগুলি তালিকাভুক্ত করুন তবে অ্যাপ্লিকেশনটির জন্য তা উপলব্ধি করে।
ডেভিড ওলবার

ঠিক আছে, তবে এটি বোঝায় যে রেজিস্ট্রি পরিষেবায় আপনাকে 1000 টি মডিউলগুলির সমস্তটি জানতে হবে। যা 1000 এর চেয়ে বেশি ভাল বিবৃতি প্রয়োজন নেই। পুরো ধারণাটি হ'ল রেজিস্ট্রি পরিষেবাটি সমস্ত মডিউল জানে না এবং বাস্তবে এটি তাদের যত্ন করে। মডিউলগুলি রেজিস্ট্রি পরিষেবাদিতে বিজ্ঞাপনের নিবন্ধভুক্ত করে। যে জানার জন্য?
আসফ মোলডাভস্কি

7

আপনি যদি কোনও বাহ্যিক জাভাস্ক্রিপ্ট ফাইলের ফাংশন বা অবজেক্টগুলি লোড করার পরিকল্পনা করে থাকেন তবে নীচের কোডটি ব্যবহার করে এই প্রসঙ্গে লোড করুন - রানইনটিস কনটেক্সট পদ্ধতিটি নোট করুন:

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

var data = fs.readFileSync('./externalfile.js');
const script = new vm.Script(data);
script.runInThisContext();

// here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context. 

2
অনেকগুলি অনুসন্ধান এবং ফ্রোব্বিংয়ের পরে, এই কৌশলটি আমার পক্ষে কাজ করেছিল। আমার ফাইলগুলি ব্রাউজারের জন্য সরাসরি ব্যবহার এবং ভেরিয়েবল ঘোষণা করার জন্য রচিত হয় যেমন: কনট এভার = {জিনিস: 'এ'}
লুচান ২

3

@ শ্রীপ্যাড এবং @ ইভানের উত্তরটি প্রসারিত করে , আমি আপনাকে নোড.জেএস এর মানক মডিউল.এক্সপোর্ট কার্যকারিতা ব্যবহার করার পরামর্শ দিচ্ছি

আপনার ফাইলটিতে ধ্রুবকগুলির জন্য ( উদাহরণস্বরূপ constants.js ), আপনি এই ধরণের ধ্রুবকগুলি লিখবেন:

const CONST1 = 1;
module.exports.CONST1 = CONST1;

const CONST2 = 2;
module.exports.CONST2 = CONST2;

তারপরে আপনি যে ফাইলটিতে এই ধ্রুবকগুলি ব্যবহার করতে চান তাতে নিম্নলিখিত কোডটি লিখুন:

const {CONST1 , CONST2} = require('./constants.js');

যদি আপনি এর const { ... }আগে সিনট্যাক্সটি কখনও দেখেননি : এটি অ্যাসস্ট্রাকচারিং অ্যাসাইনমেন্ট


0

পুনরুত্থানের জন্য দুঃখিত। আপনি node.js এ বাহ্যিক জেএস ফাইলগুলি চালনা করতে চাইল্ড_প্রসেস মডিউলটি ব্যবহার করতে পারেন

var child_process = require('child_process');

//EXECUTE yourExternalJsFile.js
child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => {
    console.log(`${stdout}`);
    console.log(`${stderr}`);
    if (error !== null) {
        console.log(`exec error: ${error}`);
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.