নোড.জেএস-এ ফাইলগুলি কীভাবে পুনরায় লোড করবেন?


444

আমি কীভাবে নোড.জেজে ফাইলগুলির একটি অটো-লোড প্রয়োগ করতে পারি সে সম্পর্কে কোনও ধারণা? আমি যখনই কোনও ফাইল পরিবর্তন করি তখন সার্ভার পুনরায় চালু করতে আমি ক্লান্ত হয়ে পড়েছি। স্পষ্টতই নোড.জেএস এর require()ফাংশন ফাইলগুলি ইতিমধ্যে প্রয়োজন হয়ে থাকলে পুনরায় লোড করে না, সুতরাং আমাকে এর মতো কিছু করতে হবে:

var sys     = require('sys'), 
    http    = require('http'),
    posix   = require('posix'),
    json    = require('./json');

var script_name = '/some/path/to/app.js';
this.app = require('./app').app;

process.watchFile(script_name, function(curr, prev){
    posix.cat(script_name).addCallback(function(content){
        process.compile( content, script_name );
    });
});

http.createServer(this.app).listen( 8080 );

এবং app.js ফাইলটিতে আমার রয়েছে:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

তবে এটিও কাজ করছে না - process.compile()বিবৃতিতে একটি ত্রুটি পেয়েছি যা বলে যে 'প্রয়োজনীয়' সংজ্ঞায়িত করা হয়নি। process.compileঅ্যাপ্লিকেশনটি প্রকাশ করছে , তবে নোড.জেএস গ্লোবাল সম্পর্কে কোনও ধারণা নেই।


4
আপনি জানেন যে প্রতিটি অনুরোধে আপনি কেবল এই কোডটি চালাতে পারেন:Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
টাওয়ার

উত্তর:


562

একটি ভাল, আপ টু ডেট বিকল্প supervisor হ'ল nodemon:

আপনার নোড.জেএস অ্যাপ্লিকেশনটিতে যে কোনও পরিবর্তনের জন্য পর্যবেক্ষণ করুন এবং স্বয়ংক্রিয়ভাবে সার্ভারটি পুনঃসূচনা করুন - বিকাশের জন্য উপযুক্ত

ব্যবহার করতে nodemon:

$ npm install nodemon -g
$ nodemon app.js

2
এবং যদি আপনি এটি নাইট্রস.আইও - এ ব্যবহার করতে চান - $ nodemon -L yourfile.js( কোডারওয়াল . com
p

3
তবে এই ক্ষেত্রে এটি সার্ভার প্রক্রিয়াটি পুনরায় চালু করে।
ফিলিপ

ফিলিপ, আপনি ঠিক বলেছেন। আমাকে আবার লগইন করতে পুনঃনির্দেশিত করা হয়েছে। আমি আশা করি এটি কেবলমাত্র সেই নির্দিষ্ট পরিবর্তিত মডিউলটিই লোড করেছে।
ar2015

7
automatically restart the server - perfect for developmentউপায় খুব বেশি হাইপারবোল। পুনরায় লোড করা সার্ভারের অর্থ ব্যাকএন্ড পরিষেবাগুলিতে লগইন হতে পারে যা আমার ক্ষেত্রে দীর্ঘ সময় নেয়। "বিকাশের জন্য উপযুক্ত" হট-লোডিং ক্লাসগুলির মতো কিছু হবে যখন প্রক্রিয়াটি অ-ল না হারিয়ে মেমোরিতে চলছে যখন অ্যান্ড্রয়েড স্টুডিওগুলি যখন আপনি সোর্স কোড পরিবর্তন করেন তখন কী করে।
নুরেটিন

2
npm install [--save-dev | -D] nodemonপ্রকল্পের সুযোগে ইনস্টলেশন সীমাবদ্ধ করতে ব্যবহার করুন ।
থিমফিল্ড

312

নোড-সুপারভাইজার দুর্দান্ত

সংরক্ষণে পুনরায় চালু করতে ব্যবহার:

এনপিএম ইনস্টল সুপারভাইজার -জি
সুপারভাইজার app.js

isaacs - http://github.com/isaacs/node-supervisor দ্বারা


3
এনপিএম ইনস্টল -জি সুপারভাইজার। এটি বিশ্বব্যাপী ইনস্টল করা উচিত।
কমল রেড্ডি

ওএসএক্স 10.2.8 এ আমাকে সুডো দিয়ে চালাতে হয়েছিল
টিমোফিয়াম

2
উইন্ডোজ এর অধীনে এটি চালাতে হয়েছিল:"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
এমপেন

1
ছাড়া -G অথবা অ্যাপ্লিকেশন root- এ উবুন্টু: npm install supervisor, node node_modules/supervisor/lib/cli-wrapper.js app.js(আমি নোডের একটি অ রুট ইনস্টলেশন আছে)
এইচ-kippo

1
@ মার্ক এর অর্থ নোড আপনার মধ্যে নেইPATH
ব্লেইস

87

আমি একটি সহজ উপায় খুঁজে পেয়েছি:

delete require.cache['/home/shimin/test2.js']

7
আপনি যদি অ্যাপ্লিকেশনটি আরম্ভ না করেই বাহ্যিক লাইব্রেরিগুলি পুনরায় লোড করতে চান তবে এটি দুর্দান্ত - আমার ক্ষেত্রে, একটি আইআরসি বট।
মিশেল টিলি

এটি দুর্দান্ত! এত সহজ এবং খুব ভাল কাজ করে। যখনই কোনও অনুরোধ আসে আমি কেবল এমন একগুচ্ছ ফাইলগুলিকে আবদ্ধ করি যা রাষ্ট্র না করে।
ভন 8

16
delete require.cache[require.resolve('./mymodule.js')]; আসল পাথগুলির সাথে চুক্তির সমাধান করুন
এডুয়ার্ডো

এটি "খারাপ অনুশীলন" বা "বিকাশ কেবল" করা কি নিরাপদ?
জোকুল

2
@ জোকুল আমি এটি নিরাপদ বলে মনে করি না, কারণ এটি ক্লাস এবং ফাংশন বা যা কিছু রফতানি পুনরায় তৈরি করতে পারে, এর সাথে তুলনা করার সময় বিভিন্ন রেফারেন্সের ফলস্বরূপ===
ক্রোলটান

20

যদি এখনও কেউ এই প্রশ্নের কাছে আসে এবং কেবলমাত্র স্ট্যান্ডার্ড মডিউলগুলি ব্যবহার করে এটি সমাধান করতে চায় তবে আমি একটি সাধারণ উদাহরণ দিয়েছি:

var process = require('process');
var cp = require('child_process');
var fs = require('fs');

var server = cp.fork('server.js');
console.log('Server started');

fs.watchFile('server.js', function (event, filename) {
    server.kill();
    console.log('Server stopped');
    server = cp.fork('server.js');
    console.log('Server started');
});

process.on('SIGINT', function () {
    server.kill();
    fs.unwatchFile('server.js');
    process.exit();
});

এই উদাহরণটি কেবলমাত্র একটি ফাইলের জন্য (সার্ভার.জেএস), তবে একাধিক ফাইলে ফাইলের অ্যারে ব্যবহার করে, সমস্ত ফাইলের নাম পেতে লুপের জন্য, বা ডিরেক্টরিটি দেখে এটি অভিযোজিত হতে পারে:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})

এই কোডটি নোড.জেএস 0.8 এপিআইয়ের জন্য তৈরি করা হয়েছিল, এটি কিছু নির্দিষ্ট প্রয়োজনের জন্য অভিযোজিত নয় তবে কিছু সাধারণ অ্যাপ্লিকেশনগুলিতে কাজ করবে।

আপডেট: এই কার্যকরীটি আমার মডিউল সিম্পিআর , গিটহাব রেপোতে প্রয়োগ করা হয়েছে


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

@ ফ্রেড এটি শুনে আমি আনন্দিত :) আমি এই সমাধানটি একটি মডিউলে প্রয়োগ করব, শীঘ্রই অনুমান করি, এর কার্যকারিতাটি কীভাবে বাড়ানো যায় সে সম্পর্কে আমার আরও কিছু ধারণা রয়েছে
মিকনিক

যদি ফাইলের watchপ্রয়োজন না fsহয় তবে বিভিন্ন সংকেত শুনে পুনরায় লোড করা যায় ।
ভ্লাদিমির ভুকানাক

18

নোডমন গুগল অনুসন্ধানে প্রথমে উঠে এসেছিল এবং মনে হয় এটি কৌশলটি করেছে:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

8

নোড-সুপারভাইজার রয়েছে যা আপনি ইনস্টল করতে পারেন

npm install supervisor

দেখতে http://github.com/isaacs/node-supervisor


2
সার্ভারটি ক্র্যাশ হয়ে গেলে এটি পুনরায় চালু করার বিষয়ে আরও বেশি। নোড-সুপারভাইজার যখন দেখা ফাইলগুলি পরিবর্তন করা হয় তখন পুরো প্রক্রিয়াটি পুনরায় চালু করে। কঠোর অর্থে এটি হট-লোড নয়।
স্পষ্টত

যদিও সত্যই হট-লোডিং নয়, এই সরঞ্জামটি কার্যকর যদি আপনি বিকাশকালে কেবল কোডটি অটোরিলোড করতে চান তবে প্রতিটি পরিবর্তনের পরে আপনাকে কমান্ড লাইনে নোড পুনরায় আরম্ভ করতে হবে না।
ডেরেক ডাহার

7

সম্পাদনা: আমার উত্তর অপ্রচলিত। নোড.জেএস একটি খুব দ্রুত পরিবর্তনশীল প্রযুক্তি।

আমি মডিউলগুলি পুনরায় লোড করার বিষয়েও অবাক হয়েছি । আমি নোড.জেএস সংশোধন করেছি এবং গিথুবটিতে উত্স / নোডে উত্সটি প্রকাশ করেছি । পার্থক্যটি হ'ল ফাংশন require। এটিতে একটি secondচ্ছিক দ্বিতীয় যুক্তি রয়েছে reload

require(url, reload)

app.jsবর্তমান ডিরেক্টরি ব্যবহার পুনরায় লোড করতে

app = require("./app", true);

এর মতো কিছু লিখুন এবং আপনার অটো- লোড রয়েছে:

process.watchFile(script_name, function(curr, prev) {
    module = reload(script_name, true);
});

কেবলমাত্র আমি দেখতে পাচ্ছি সমস্যাটি পরিবর্তনশীল module, তবে আমি এখন এটিতে কাজ করছি।


7

nodemonএকটি মহান এক। আমি কেবল ডিবাগিং এবং দেখার বিকল্পগুলির জন্য আরও পরামিতি যুক্ত করি।

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

আদেশ: nodemon --watch server --inspect ./server/server.js

যেখানে:

--watch serverযখন পরিবর্তন অ্যাপ্লিকেশন পুনরায় চালু করুন .js, .mjs, .coffee, .litcoffee, এবং .jsonফাইল serverফোল্ডারের (অন্তর্ভুক্ত সাবফোল্ডার)।

--inspect রিমোট ডিবাগ সক্ষম করুন।

./server/server.js প্রবেশের স্থান।

তারপরে নীচের কনফিগারেশনটি launch.json(ভিএস কোড) যুক্ত করুন এবং যে কোনও সময় ডিবাগিং শুরু করুন।

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}

মনে রাখবেন nodemonপ্রকল্পের ডেভ নির্ভরতা হিসাবে ইনস্টল করা ভাল । সুতরাং আপনার দলের সদস্যদের এটি ইনস্টল করার বা কমান্ড আর্গুমেন্টগুলি মনে করার দরকার নেই, তারা ঠিক npm run devএবং হ্যাকিং শুরু করে।

ডক্সে আরও দেখুন nodemon: https://github.com/remy/nodemon#mon ماني- মাল্টিপল- ডিরেক্টরি


নোডেমনের সাম্প্রতিক সংস্করণগুলির জন্য গ্লোববিং সমর্থিত নয় (কমপক্ষে 1.19.0)। পরিবর্তে কেবল নোডমন - ওয়াচ সার্ভার --inspect ./server/server.js ব্যবহার করুন।
অ্যালেক্স

আপনার তথ্যের জন্য @ অ্যালেক্সকে ধন্যবাদ। উত্তর আপডেট করেছেন।
নিনহ ফাম

5

নোড.জেএস মেলিং তালিকায় এই বিষয়টি সম্পর্কে সাম্প্রতিক থ্রেড ছিল । সংক্ষিপ্ত উত্তর হ'ল না, বর্তমানে প্রয়োজনীয় ফাইলগুলি স্বয়ংক্রিয় পুনরায় লোড করা সম্ভব নয়, তবে বেশিরভাগ লোক প্যাচগুলি তৈরি করেছেন যা এই বৈশিষ্ট্যটি যুক্ত করে।


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

5

এই সমস্যার আর একটি সমাধান চিরকাল ব্যবহার করা

ফরওয়ারের আরেকটি দরকারী দক্ষতা হ'ল কোনও উত্স ফাইল পরিবর্তন হয়ে গেলে এটি বিকল্পভাবে আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করতে পারে। এটি প্রতিবার কোনও বৈশিষ্ট্য যুক্ত করার পরে বা বাগ ঠিক করার সময় ম্যানুয়ালি পুনঃসূচনা করতে আপনাকে মুক্তি দেয়। এই মোডে চিরকাল শুরু করতে, -উ পতাকাটি ব্যবহার করুন:

forever -w start server.js

আশ্চর্যজনকভাবে -W পতাকা সহ আমার এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটি সিএসএস ব্যবহার করে না।
কোস্টা

5

নোড-ডেভ দুর্দান্ত কাজ করে। npminstall node-dev

এমনকি সার্ভারটি পুনরায় লোড হওয়ার পরে এটি একটি ডেস্কটপ বিজ্ঞপ্তি দেয় এবং বার্তাটিতে সাফল্য বা ত্রুটি দেয়।

কমান্ড লাইনে আপনার অ্যাপ্লিকেশনটি এর সাথে শুরু করুন:

node-dev app.js


3

নোডের জন্য হট রিলোডিং সম্পর্কিত একটি ব্লগ পোস্ট এখানে । এটি একটি গিথুব নোড শাখা সরবরাহ করে যা আপনি হট রিলোডিং সক্ষম করার জন্য আপনার নোডের ইনস্টলেশন প্রতিস্থাপন করতে ব্যবহার করতে পারেন।

ব্লগ থেকে:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

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


এই সমাধানটির সাথে একমাত্র এটি হ'ল এটি নোডের পুরানো সংস্করণটির কাঁটাচামচ, তাই এটি ব্যবহারের আগে এটি সাময়িকভাবে সাম্প্রতিক সংস্করণে টিকযুক্ত এবং একত্রীকরণ করতে হবে (যদি না আপনি নোডের পুরানো সংস্করণটি ব্যবহার না করে)।
চেতন

3

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

এতদূর ভাল, তবে আমি কীভাবে একটি মডিউল পুনরায় লোড করব তা নিয়ে আমি হোঁচট খেয়েছি। স্পষ্টতই, কেউ কেবল "প্রয়োজনীয়" ক্যাশে থেকে মডিউলটি সরিয়ে কাজটি সম্পন্ন করতে পারে। যেহেতু আমি সরাসরি নোড সোর্স কোডটি পরিবর্তন করতে আগ্রহী নই, তাই আমি খুব হ্যাকি-হ্যাক নিয়ে এসেছি যা হ'ল: স্ট্যাকের সন্ধানে "আবশ্যক" ফাংশনটির শেষ কলটি সন্ধান করুন, এটি "ক্যাশে" ক্ষেত্রের একটি রেফারেন্স ধরুন এবং..ও, নোডের রেফারেন্সটি মুছুন:

    var args = arguments
    while(!args['1'] || !args['1'].cache) {
        args = args.callee.caller.arguments
    }
    var cache = args['1'].cache
    util.log('remove cache ' + moduleFullpathAndExt)
    delete( cache[ moduleFullpathAndExt ] )

এমনকি সহজ, আসলে:

var deleteCache = function(moduleFullpathAndExt) {
  delete( require.cache[ moduleFullpathAndExt ] )
}

স্পষ্টতই, এটি ঠিক কাজ করে। সেই যুক্তি ["1"] এর অর্থ কী তা সম্পর্কে আমার একেবারেই ধারণা নেই তবে এটি কাজ করছে। আমি বিশ্বাস করি যে নোড ছেলেরা কোনও দিন কোনও পুনরায় লোড সুবিধা বাস্তবায়ন করবে, তাই আমি অনুমান করি যে আপাতত এই সমাধানটিও গ্রহণযোগ্য। (বিটিডব্লিউ। আমার "জিনিসটি এখানে আসবে: https://github.com/cheng81/wirez , কয়েক সপ্তাহের মধ্যে সেখানে যান এবং আমি কী সম্পর্কে বলছি তা আপনার উচিত)


.. অবশ্যই খুব সহজ নয়। এটি যদি সেখানে থাকে তবেই কাজ করেকল স্ট্যাকের জন্য কোনও কল করার প্রয়োজন হয় । ওহ ভাল, একটি হ্যাক শীর্ষে সহজ হ্যাক: একটি টেম্প স্ক্রিপ্ট মধ্যে স্টাফ লিখুন, এবং রানটাইম এ এটি প্রয়োজন। এটি করেছে, এটি কাজ করে .. এবং এটি এমনকি ক্যাশে থেকে নিজেকে পরিষ্কার করে
চেং 8১

এবং প্রকৃতপক্ষে এটি আরও সহজ ছিল: মুছে দিন (প্রয়োজনীয় কোডা [মডিউলফুলপাথএন্ডেক্সট])
চেং 81

নোড.জেএস মডিউলগুলি আসলে একটি বেনামি ফাংশনে আবৃত থাকে যা মডিউল এনক্যাপসুলেশনটি কীভাবে হয়। প্রতিটি মডিউল আসলে দেখতে লাগে function (module, require) { /* your code */ }। আপনি যখন এটিকে বিবেচনা করেন তখন arguments[1]পয়েন্ট করুনrequire । এবং যখন লুপটি এমন পরিস্থিতিতে রয়েছে যেখানে আপনি মডিউলের অন্য ফাংশনের মধ্যে থেকে এটি কল করেন (এটি কেবল ফাংশন শ্রেণিবিন্যাসে উঠে যায় এবং প্রতিটিটিতে আর্গুমেন্টের মানগুলি পরীক্ষা করে)।
জে কে

3

আপনি এনপিএম থেকে নোডমন ব্যবহার করতে পারেন । এবং যদি আপনি এক্সপ্রেস জেনারেটর ব্যবহার করে থাকেন তবে আপনি আপনার প্রকল্প ফোল্ডারের ভিতরে এই কমান্ডটি ব্যবহার করতে পারেন:

nodemon npm start

বা ডিবাগ মোড ব্যবহার করে

DEBUG=yourapp:* nodemon npm start

আপনি সরাসরি চালাতে পারেন

nodemon your-app-file.js

এই সাহায্য আশা করি।


1

সমাধানটি এখানে: http://github.com/shimondoodkin/node-hot-reload

লক্ষ্য করুন যে আপনাকে ব্যবহৃত রেফারেন্সগুলির নিজের যত্ন নিতে হবে।

এর অর্থ যদি আপনি করেন: var x = প্রয়োজনীয় ('foo'); Y = এক্স; z- র = x.bar; এবং গরম এটি পুনরায় লোড করেছে।

এর অর্থ আপনাকে x, y এবং z এ সঞ্চিত রেফারেন্সগুলি প্রতিস্থাপন করতে হবে। হট রিয়েলোড কলব্যাক ফাংশনে।

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

এছাড়াও আমি আমার নোড-ইনফ্লো মডিউলটি পছন্দ করি।


1

নোডমন বা অন্য সরঞ্জামগুলি ব্যবহার করার প্রয়োজন নেই । আপনার আইডিইয়ের সক্ষমতা কেবল ব্যবহার করুন।

সম্ভবত সেরা এক IntelliJ WebStorm জন্য গরম রিলোড বৈশিষ্ট্য (স্বয়ংক্রিয় সার্ভার এবং ব্রাউজার রিলোড) সঙ্গে Node.js


1

উইন্ডোজটিতে ব্যবহারের জন্য এখানে একটি নিম্ন প্রযুক্তি পদ্ধতি রয়েছে। এটি বলে একটি ব্যাচ ফাইলে রাখুন serve.bat:

@echo off

:serve
start /wait node.exe %*
goto :serve

এখন node app.jsআপনার সেমিডি শেল থেকে চালানোর পরিবর্তে চালানserve app.js

এটি সার্ভারে চলমান একটি নতুন শেল উইন্ডো খুলবে। ব্যাচের ফাইলটি ব্লক হয়ে যাবে (কারণ/waitআপনি শেল উইন্ডোটি বন্ধ না করা পর্যন্ত ) মূল সিএমডি শেলটি "ব্যাচ চাকুরী (ওয়াই / এন) টার্মিনেট জিজ্ঞাসা করবে?" আপনি যদি "এন" এর উত্তর দেন তবে সার্ভারটি আবার চালু হবে।

প্রতিবার আপনি যখন সার্ভারটি পুনরায় চালু করতে চান, সার্ভার উইন্ডোটি বন্ধ করুন এবং সেন্টিমিডি শেলের উত্তর "এন" দিন।


1

আমার অ্যাপ্লিকেশন কাঠামো:

NodeAPP (folder)
   |-- app (folder)
      |-- all other file is here
   |-- node_modules (folder)
   |-- package.json
   |-- server.js (my server file)

এই কমান্ডটি দিয়ে প্রথমে পুনরায় লোড করুন :

npm install [-g] [--save-dev] reload

তারপরে প্যাকেজ.জসন পরিবর্তন করুন :

"scripts": {
    "start": "nodemon -e css,ejs,js,json --watch app"
}

এখন আপনাকে অবশ্যই আপনার সার্ভার ফাইলে পুনরায় লোড ব্যবহার করতে হবে :

var express = require('express');
var reload = require('reload');
var app = express();

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    console.log( 'server is running on port ' + app.get('port'));
});

reload(server, app);

এবং শেষ পরিবর্তনের জন্য, আপনার প্রতিক্রিয়া শেষে এই স্ক্রিপ্টটি প্রেরণ করুন :

<script src="/reload/reload.js"></script>

এখন এই কোড দিয়ে আপনার অ্যাপ্লিকেশন শুরু করুন:

npm start

এই পদ্ধতিটি কার্যকর হয় না, তবে এনপিএমজেএস / প্যাকেজ / রিলোড (এক্সপ্রেস অ্যাপ্লিকেশানগুলির জন্য) এর দ্বারা নেতৃত্ব দেওয়া হয়েছে ।
ম্যাক্সি বার্কম্যান

0

এটা ব্যবহার কর:

function reload_config(file) {
  if (!(this instanceof reload_config))
    return new reload_config(file);
  var self = this;

  self.path = path.resolve(file);

  fs.watchFile(file, function(curr, prev) {
    delete require.cache[self.path];
    _.extend(self, require(file));
  });

  _.extend(self, require(file));
}

আপনাকে এখন যা করতে হবে তা হ'ল:

var config = reload_config("./config");

এবং কনফিগারেশন স্বয়ংক্রিয়ভাবে পুনরায় লোড হবে :)


এমন একটি সংস্করণ পেয়েছেন যা নোডের অংশ নয় এমন ফ্রেমওয়ার্কের উপর নির্ভর করে না?
অ্যাড্রিয়ান

0

লোডডির একটি ডিরেক্টরি দ্রুত লোড করার জন্য আমার সমাধান, পুনরাবৃত্তভাবে।

ফিরে আসতে পারে

{ 'path/to/file': 'fileContents...' } অথবা { path: { to: { file: 'fileContents'} } }

ইহা ছিল callback যা ফাইল পরিবর্তন করা হয় ডাকা হবে।

এটি এমন পরিস্থিতি পরিচালনা করে যেখানে ফাইলগুলি যথেষ্ট বড় যেগুলি watchতাদের লেখা শেষ হওয়ার আগেই কল হয়ে যায়।

আমি এক বছর বা তার বেশি সময় ধরে এটি প্রকল্পগুলিতে ব্যবহার করছি এবং সম্প্রতি এটিতে প্রতিশ্রুতি যুক্ত করেছি।

আমাকে যুদ্ধ পরীক্ষা করতে সহায়তা করুন!

https://github.com/danschumann/loaddir


0

আপনি সার্ভারটি বন্ধ না করে মডিউলটি পুনরায় লোড করতে স্বয়ংক্রিয় পুনরায় লোড ব্যবহার করতে পারেন।

ইনস্টল

npm install auto-reload

উদাহরণ

data.json

{ "name" : "Alan" }

test.js

var fs = require('fs');
var reload = require('auto-reload');
var data = reload('./data', 3000); // reload every 3 secs

// print data every sec
setInterval(function() {
    console.log(data);
}, 1000);

// update data.json every 3 secs
setInterval(function() {
    var data = '{ "name":"' + Math.random() + '" }';
    fs.writeFile('./data.json', data);
}, 3000);

ফলাফল:

{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }

0

আর একটি সহজ সমাধান হ'ল প্রয়োজনীয় ব্যবহারের পরিবর্তে fs.readFile ব্যবহার করা একটি পাঠ্য ফাইল সংরক্ষণ করতে পারেন পুনরায় লোড করার জন্য সার্ভারে একটি বিরতি তৈরি করতে পারেন।

পেশাদাররা:

  • বাহ্যিক libs ব্যবহার করার প্রয়োজন নেই
  • উত্পাদনের জন্য প্রাসঙ্গিক (পরিবর্তনে কনফিগার ফাইল পুনরায় লোড করা হচ্ছে)
  • কার্যকর করা সহজ

কনস:

  • আপনি একটি মডিউল পুনরায় লোড করতে পারবেন না - কী-মান ডেটাযুক্ত একটি জসন

0

ভ্যাগ্র্যান্ট এবং পিএইচপিএসটারম ব্যবহারকারী লোকেদের জন্য, ফাইল প্রদর্শক একটি দ্রুত পদ্ধতির

  • ফাইলগুলির তাত্ক্ষণিক সিঙ্কটি অক্ষম করুন যাতে আপনি কেবল সংরক্ষণের সময় কমান্ডটি চালান তারপরে * .js ফাইল এবং কার্যক্ষম ডিরেক্টরিগুলির জন্য একটি সুযোগ তৈরি করুন এবং এই আদেশটি যুক্ত করুন

    ভ্যাগ্র্যান্ট এসএস-সি "/var/www/gadelkareem.com/forever.sh পুনঃসূচনা"

যেখানে চিরকালের জন্য

#!/bin/bash

cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js

0

আমি সম্প্রতি এই প্রশ্নে এসেছি কারণ সাধারণ সন্দেহভাজনরা লিঙ্কযুক্ত প্যাকেজগুলির সাথে কাজ করে না। আপনি যদি আমার মতো হন এবং npm linkঅনেকগুলি প্যাকেজ নিয়ে গঠিত একটি প্রকল্পে কার্যকরভাবে কাজ করার জন্য বিকাশের সময় সুযোগ গ্রহণ করেন , তবে নির্ভরশীলতার মধ্যে ঘটে এমন পরিবর্তনগুলি পুনরায় লোডকে ট্রিগারও করা গুরুত্বপূর্ণ।

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

রিডমি থেকে:

সুপারভাইজার বা নোডমনের মতো সরঞ্জামগুলির বিপরীতে এটি ফাইলগুলি দেখার জন্য ফাইল সিস্টেমটি স্ক্যান করে না। পরিবর্তে এটি কেবলমাত্র প্রয়োজনীয় ফাইলগুলি দেখার জন্য নোডের প্রয়োজনীয় () ফাংশনটি দেখে।


0
const cleanCache = (moduleId) => {
    const module = require.cache[moduleId];
    if (!module) {
        return;
    }
    // 1. clean parent
    if (module.parent) {
        module.parent.children.splice(module.parent.children.indexOf(module), 1);
    }
    // 2. clean self
    require.cache[moduleId] = null;
};

0

আপনি এটি ব্রাউজার-রিফ্রেশ দিয়ে করতে পারেন । আপনার নোড অ্যাপটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে, ব্রাউজারে আপনার ফলাফল পৃষ্ঠাটি স্বয়ংক্রিয়ভাবে সতেজ হয়। খারাপ দিকটি হ'ল আপনাকে উত্পন্ন পৃষ্ঠায় জেএস স্নিপেট রাখতে হবে। কাজের উদাহরণের জন্য এখানে রেপো

const http = require('http');
const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/html; charset=UTF-8');
    res.write('Simple refresh!');
    res.write(`<script src=${process.env.BROWSER_REFRESH_URL}></script>`);
    res.end();
})

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);

    if (process.send) {
        process.send({ event: 'online', url: `http://${hostname}:${port}/` })
    }

});

0

আমি চেষ্টা করেছি 2 pm : ইনস্টলেশনটি ব্যবহার করা সহজ এবং সহজ; ফলাফল সন্তোষজনক। যাইহোক, আমরা চাই যে pm2 এর সংস্করণটি আমাদের যত্ন নিতে হবে। দুপুর ২ টা রানটাইম হ'ল ফ্রি সংস্করণ, যেখানে পিএম 2 প্লাস এবং পিএম 2 এন্টারপ্রাইজ নিখরচায় নয়।

স্ট্রংলুপের হিসাবে , আমার ইনস্টলেশনটি ব্যর্থ হয়েছে বা সম্পূর্ণ হয়নি, তাই আমি এটি ব্যবহার করতে পারিনি।


-1

আজকাল হট অপশন সহ ওয়েবপ্যাক ডেভ সার্ভার ব্যবহার করা হয়। আপনি আপনার প্যাকেজ.জসনে এটির মতো স্ক্রিপ্ট যুক্ত করতে পারেন:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

এবং আপনার ফাইলগুলির প্রতিটি পরিবর্তন স্বয়ংক্রিয়ভাবে একটি পুনঃসংযোগটি ট্রিগার করবে


2
এই উত্তরটি প্রশ্নটি ভুল। ওয়েবপ্যাকটি ফ্রন্টএন্ড অ্যাপ্লিকেশনগুলির জন্য এবং ডেভ সার্ভারটি একটি নিজস্ব ওয়েবসভার। প্রশ্নটি নোডে প্রয়োগ করা একটি সার্ভার অ্যাপ্লিকেশনকে নির্দেশ করছে। এটির জন্য ওয়েবসভারের দরকার নেই। এটি ইতিমধ্যে একটি।
ড্যানিয়েল খান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.