จะโหลดไฟล์อัตโนมัติใน Node.js ได้อย่างไร?


444

แนวคิดใดบ้างที่ฉันสามารถใช้การโหลดไฟล์อัตโนมัติใน Node.js ฉันเบื่อที่จะรีสตาร์ทเซิร์ฟเวอร์ทุกครั้งที่ฉันเปลี่ยนไฟล์ เห็นได้ชัดว่า Node.js '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กำลังตรวจสอบapp.jsแต่ไม่มีเงื่อนงำเกี่ยวกับ node.js globals


4
คุณรู้ว่าคุณสามารถเรียกใช้รหัสนี้ในแต่ละคำขอ:Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Tower

คำตอบ:


562

ทางเลือกที่ดีและทันสมัยsupervisorคือnodemon:

ตรวจสอบการเปลี่ยนแปลงใด ๆ ในแอ็พพลิเคชัน node.js ของคุณและรีสตาร์ทเซิร์ฟเวอร์โดยอัตโนมัติ - เหมาะสำหรับการพัฒนา

วิธีใช้nodemon:

$ npm install nodemon -g
$ nodemon app.js

2
และถ้าคุณต้องการใช้ในNitrous.io - $ nodemon -L yourfile.js(คำอธิบายแบบเต็มที่coderwall.com/p/aqxl_q )
drzaus

3
แต่ในกรณีนี้รีสตาร์ทกระบวนการเซิร์ฟเวอร์เช่นกัน
Filipe

@Filipe คุณพูดถูก ฉันถูกเปลี่ยนเส้นทางเพื่อเข้าสู่ระบบอีกครั้ง ฉันหวังว่าจะโหลดเฉพาะโมดูลที่ได้รับการแก้ไขเท่านั้น
ar2015

8
automatically restart the server - perfect for developmentมันเป็นอติพจน์มากเกินไป การโหลดเซิร์ฟเวอร์ใหม่อาจหมายถึงการเข้าสู่บริการแบ็คเอนด์ซึ่งใช้เวลานานในกรณีของฉัน "เหมาะสำหรับการพัฒนา" จะเป็นเหมือนคลาสรีโหลดใหม่ในขณะที่กระบวนการทำงานในหน่วยความจำโดยไม่สูญเสียสถานะ a-la ใดที่สตูดิโอ android ทำเมื่อคุณเปลี่ยนซอร์สโค้ด
nurettin

2
ใช้npm install [--save-dev | -D] nodemonเพื่อ จำกัด การติดตั้งให้กับขอบเขตโครงการ
themefield

312

node-supervisor ยอดเยี่ยม

การใช้งานเพื่อรีสตาร์ทเมื่อบันทึก:

npm ติดตั้ง supervisor -g
supervisor app.js

โดย isaacs - http://github.com/isaacs/node-supervisor


3
npm install -g supervisor มันควรจะติดตั้งทั่วโลก
Kamal Reddy

ใน OSX 10.2.8 ผมต้องวิ่งด้วย sudo
Timopheym

2
ต้องวิ่งมันเช่นนี้ภายใต้ Windows:"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
mpen

1
โดยไม่ต้อง -G หรือ sudo ที่รากแอปnpm install supervisor, node node_modules/supervisor/lib/cli-wrapper.js app.js(ฉันมีการติดตั้งที่ไม่ใช่รากของ Node)
H-Kippo

1
@ Mark หมายถึงโหนดไม่ได้อยู่ในของคุณPATH
Blaise

88

ฉันพบวิธีง่ายๆ:

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

7
เป็นการดีถ้าคุณต้องการโหลดไลบรารีภายนอกโดยไม่ต้องรีสตาร์ทแอพ - ในกรณีของฉันคือบอท IRC
Michelle Tilley

มันยอดเยี่ยมมาก! เรียบง่ายและทำงานได้ดีมาก เมื่อใดก็ตามที่มีคำขอเข้ามาฉันก็จะทำการแยกไฟล์หลาย ๆ ไฟล์ที่ไม่มีสถานะ
vaughan

16
delete require.cache[require.resolve('./mymodule.js')]; แก้ไขข้อตกลงกับเส้นทางจริง
Eduardo

สิ่งนี้ปลอดภัยที่จะทำหรือถือเป็น "การปฏิบัติที่ไม่ดี" หรือ "การพัฒนาเท่านั้น" หรือไม่?
jocull

2
@ jocull ฉันไม่คิดว่ามันปลอดภัยเพราะมันอาจจะสร้างคลาสและฟังก์ชั่นหรือการส่งออกใด ๆ ที่ส่งผลให้มีการอ้างอิงที่แตกต่างกันเมื่อเทียบกับ===
Kroltan

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

ตัวอย่างนี้มีเพียงหนึ่งไฟล์ (server.js) แต่สามารถปรับให้เข้ากับหลาย ๆ ไฟล์โดยใช้อาเรย์ของไฟล์ a สำหรับลูปเพื่อรับชื่อไฟล์ทั้งหมดหรือโดยการดูไดเรกทอรี:

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

รหัสนี้ทำขึ้นสำหรับ Node.js 0.8 API ซึ่งไม่ได้ปรับให้เหมาะกับความต้องการเฉพาะบางอย่าง แต่จะทำงานในแอพง่าย ๆ

ปรับปรุง: ฟังก์ชั่นนี้จะใช้งานในโมดูลของฉันง่าย R , GitHub repo


1
นี่เป็นทางออกที่ยอดเยี่ยมและเรียบง่าย ฉันเพิ่งใช้มันสำหรับบอทที่ควรจะปรับปรุงตัวเองจากคอมไพล์เมื่อบอกโดยผู้ดูแล ปัญหาคือเมื่อคุณอยู่ในแอพคุณจะไม่สามารถรีสตาร์ทตัวเองได้ อย่างไรก็ตามฉันสามารถใช้วิธีการของคุณเพื่อวางไข่อินสแตนซ์ของ bot และดู dotfile บอทจะอัพเดทตัวเองแตะที่ dotfile และตัวเรียกใช้งานจะรีสตาร์ทโดยอัตโนมัติ ! น่ากลัว
Fred

@ เฟรดฉันดีใจที่ได้ยินเช่นนี้ :) ฉันจะใช้โซลูชันนี้ในโมดูลเร็ว ๆ นี้ฉันเดาว่าฉันมีความคิดเพิ่มเติมเกี่ยวกับวิธีการขยายการทำงานของมัน
micnic

หากwatchไม่ต้องการไฟล์สามารถทำการโหลดซ้ำได้fsโดยการฟังสัญญาณต่าง ๆ
Vladimir Vukanac

18

พยักหน้ามาก่อนในการค้นหาของ Google และดูเหมือนว่าจะทำเคล็ดลับ:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

8

มี Node-Supervisor ที่คุณสามารถติดตั้งได้

npm install supervisor

ดูhttp://github.com/isaacs/node-supervisor


2
มันเกี่ยวกับการรีสตาร์ทเซิร์ฟเวอร์ถ้ามันล้มเหลว node-supervisor รีสตาร์ทกระบวนการทั้งหมดเมื่อไฟล์ที่ถูกดูเปลี่ยนแปลงไป มันไม่ร้อนแรงในแง่ที่เข้มงวด
nalply

แม้ว่าจะไม่ได้โหลดมาแรง แต่เครื่องมือนี้มีประโยชน์มากหากคุณต้องการให้โค้ดโหลดอัตโนมัติในขณะที่คุณกำลังพัฒนาดังนั้นคุณไม่ต้องรีสตาร์ทโหนดในบรรทัดคำสั่งหลังจากการเปลี่ยนแปลงทุกครั้ง
Derek Dahmer

7

แก้ไข:คำตอบของฉันล้าสมัย Node.js เป็นเทคโนโลยีที่เปลี่ยนแปลงอย่างรวดเร็ว

ฉันยังสงสัยเกี่ยวกับการโหลดโมดูลอีกครั้ง ผมปรับเปลี่ยน Node.js และมีการเผยแพร่แหล่งที่ Github ที่nalply / โหนด requireความแตกต่างเพียงอย่างเดียวคือฟังก์ชั่น 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(VS Code) และเริ่มการดีบักทุกเวลา

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

โปรดทราบว่าการติดตั้งnodemonเป็นการดียิ่งขึ้นสำหรับการพึ่งพาโครงการ ดังนั้นสมาชิกในทีมของคุณไม่จำเป็นต้องติดตั้งหรือจำอาร์กิวเมนต์คำสั่งพวกเขาเพียงแค่npm run devและเริ่มแฮ็ค

ดูเพิ่มเติมเกี่ยวกับnodemonเอกสาร: https://github.com/remy/nodemon#monitoring-multiple-directories


Globbing ไม่รองรับ nodemon เวอร์ชันล่าสุด (อย่างน้อย 1.19.0) เพียงใช้ nodemon --watch เซิร์ฟเวอร์ --inspect ./server/server.js แทน
อเล็กซ์

ขอบคุณ @Alex สำหรับข้อมูลของคุณ อัปเดตคำตอบ
Ninh Pham

5

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


1
+1 ใช่ ฉันเข้าร่วมการสนทนา ฉันยอมรับว่าวิธีแก้ปัญหาของฉันง่ายเกินไป ใช้งานได้หากโมดูลตัวเองไม่ต้องการโมดูลเพิ่มเติม วิธีแก้ปัญหาของเฟลิกซ์นั้นดีกว่า แต่มันก็ถูกถกเถียงกันว่าถ้าโหลดอัตโนมัติเป็นของแกนกลางจริงๆ
ใกล้

5

อีกวิธีหนึ่งสำหรับปัญหานี้คือใช้ตลอดไป

ความสามารถที่เป็นประโยชน์อีกประการหนึ่งของ Forever คือมันสามารถเลือกรีสตาร์ทแอปพลิเคชันของคุณได้เมื่อมีการเปลี่ยนแปลงไฟล์ต้นฉบับ สิ่งนี้จะทำให้คุณไม่ต้องรีสตาร์ทด้วยตนเองทุกครั้งที่คุณเพิ่มคุณสมบัติหรือแก้ไขข้อบกพร่อง หากต้องการเริ่มถาวรในโหมดนี้ให้ใช้แฟล็ก -w:

forever -w start server.js

แปลกกับแฟล็ก -w แอป express.js ของฉันไม่ได้ใช้ CSS
Costa

5

node-dev ใช้งานได้ดี NPMinstall node-dev

มันยังให้เดสก์ท็อปแจ้งเตือนเมื่อเซิร์ฟเวอร์โหลดใหม่และจะให้ความสำเร็จหรือข้อผิดพลาดในข้อความ

เริ่มแอปของคุณในบรรทัดคำสั่งด้วย:

node-dev app.js


3

นี่คือโพสต์บล็อกเกี่ยวกับ Hot Reloading สำหรับ Node มันให้สาขา Github โหนดที่คุณสามารถใช้เพื่อแทนที่การติดตั้งโหนดเพื่อเปิดใช้งานการโหลดร้อน

จากบล็อก:

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

ตอนนี้เมื่อใดก็ตามที่คุณแก้ไข myRequestHandler.js โค้ดด้านบนจะสังเกตเห็นและแทนที่ requestHandler ในพื้นที่ด้วยรหัสใหม่ คำขอที่มีอยู่ใด ๆ จะยังคงใช้รหัสเดิมต่อไปในขณะที่คำขอเข้ามาใหม่จะใช้รหัสใหม่ ทั้งหมดนี้โดยไม่ต้องปิดเซิร์ฟเวอร์การตีกลับคำขอใด ๆ ฆ่าคำขอใด ๆ ก่อนกำหนดหรือแม้แต่พึ่งพาตัวโหลดบาลานซ์อัจฉริยะ


สิ่งเดียวที่มีวิธีนี้คือมันเป็นทางแยกของ Node เวอร์ชันเก่าดังนั้นมันจะต้องถูกปรับแต่งและผสานเข้ากับเวอร์ชั่นล่าสุดก่อนที่จะใช้งาน
Chetan

3

ฉันกำลังทำงานเพื่อสร้างโหนด "สิ่ง" ที่ค่อนข้างเล็กซึ่งสามารถโหลด / ยกเลิกการโหลดโมดูลได้ตามต้องการ (เช่นคุณสามารถรีสตาร์ทแอปพลิเคชันบางส่วนของคุณได้โดยไม่ทำให้แอปทั้งหมดลง) ฉันกำลังรวมการจัดการการพึ่งพา (โง่มาก) ดังนั้นถ้าคุณต้องการหยุดโมดูลโมดูลทั้งหมดที่ขึ้นอยู่กับที่จะหยุดเช่นกัน

จนถึงตอนนี้ดีมาก แต่จากนั้นฉันก็พบปัญหาในการโหลดโมดูล เห็นได้ชัดว่าใคร ๆ ก็สามารถลบโมดูลออกจากแคช "ต้องการ" และทำงานให้เสร็จได้ ตั้งแต่ฉันไม่กระตือรือร้นที่จะเปลี่ยนโดยตรงรหัสโหนดแหล่งที่มาที่ฉันมาด้วยมาก hacky สับที่เป็น: การค้นหาในกองติดตามโทรล่าสุดที่ "ต้อง" ฟังก์ชั่นคว้าอ้างอิงถึงมันฟิลด์ "แคช" และ .. จากนั้นให้ลบการอ้างอิงไปยังโหนด:

    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 "แต่มันกำลังทำงานอยู่ ฉันเชื่อว่าพวกโหนดจะใช้สิ่งอำนวยความสะดวกในการโหลดอีกครั้งดังนั้นฉันจึงเดาว่าในตอนนี้โซลูชันนี้ก็เป็นที่ยอมรับเช่นกัน (btw. "สิ่งของ" ของฉันจะอยู่ที่นี่: https://github.com/cheng81/wirezไปที่นั่นในอีกสองสามสัปดาห์และคุณควรเห็นสิ่งที่ฉันพูดถึง)


.. แน่นอนว่าไม่ใช่เรื่องง่าย ใช้งานได้เฉพาะในกรณีที่มีการโทรที่ต้องใช้ในสแตกการโทร โอ้แฮ็คง่าย ๆ ที่อยู่ด้านบนของแฮ็ค: เขียนสิ่งนั้นลงในสคริปต์อุณหภูมิและต้องการมันในเวลาทำงาน ใช่มันใช้งานได้และยังทำความสะอาดตัวเองจากแคช
cheng81

และจริง ๆ แล้วมันง่ายขึ้น: ลบ (require.cache [moduleFullpathAndExt])
cheng81

โมดูล Node.js ถูกห่อในฟังก์ชั่นที่ไม่ระบุชื่อซึ่งเป็นวิธีการห่อหุ้มโมดูลจะทำ function (module, require) { /* your code */ }แต่ละโมดูลจริงดูเหมือน เมื่อคุณใช้เวลานี้ในบัญชีจุดarguments[1] requireและห่วงลูปจะมีสำหรับสถานการณ์ที่คุณเรียกสิ่งนี้จากภายในฟังก์ชันอื่นในโมดูล (มันจะขึ้นไปตามลำดับชั้นของฟังก์ชั่นและตรวจสอบค่าอาร์กิวเมนต์ที่ส่งผ่านไปยังแต่ละ)
JK

3

คุณสามารถใช้nodemonจากNPM และถ้าคุณใช้ตัวสร้างด่วนคุณสามารถใช้คำสั่งนี้ในโฟลเดอร์โครงการของคุณ:

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 = x; Z = x.bar; และร้อนโหลดใหม่

หมายความว่าคุณต้องแทนที่การอ้างอิงที่เก็บไว้ใน x, y และ z ในฟังก์ชั่นการเรียกกลับแบบเรียลโหลด

บางคนสับสนว่า hot reload โดยอัตโนมัติรีสตาร์ทโมดูล nodejs-autorestart ของฉันนอกจากนี้ยังมีการรวมที่ล้ำหน้าเพื่อเปิดใช้งานการเริ่มอัตโนมัติเมื่อบูต หากคุณมีการรีสตาร์ทอัตโนมัติของแอพขนาดเล็กก็เป็นเรื่องปกติ แต่เมื่อคุณมีแอพโหลดใหม่ที่มีขนาดใหญ่เหมาะกว่า เนื่องจากการโหลดซ้ำร้อนเร็วกว่า

นอกจากนี้ฉันชอบโมดูลโหนดการไหลเข้าของฉัน


1

ไม่จำเป็นต้องใช้nodemonหรือเครื่องมืออื่น ๆ เช่นนั้น เพียงใช้ความสามารถของ IDE ของคุณ

อาจเป็นหนึ่งในที่ดีที่สุดคือIntelliJ WebStormที่มีคุณสมบัติโหลดร้อน (เซิร์ฟเวอร์และเบราว์เซอร์อัตโนมัติโหลด) สำหรับNode.js


1

นี่คือวิธีการใช้เทคโนโลยีต่ำสำหรับการใช้งานใน Windows วางสิ่งนี้ลงในไฟล์แบทช์ชื่อserve.bat:

@echo off

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

ตอนนี้แทนที่จะรันnode app.jsจาก cmd shell ของคุณให้รันserve app.jsของคุณวิ่ง

จะเป็นการเปิดหน้าต่างเชลล์ใหม่ที่รันเซิร์ฟเวอร์ ไฟล์แบตช์จะปิดกั้น (เพราะ/wait ) จนกว่าคุณจะปิดหน้าต่างเชลล์ ณ จุดใดเชลล์ cmd ดั้งเดิมจะถามว่า "ยุติแบตช์งาน (Y / N)?" หากคุณตอบ "N" เซิร์ฟเวอร์จะเปิดใหม่

ทุกครั้งที่คุณต้องการรีสตาร์ทเซิร์ฟเวอร์ให้ปิดหน้าต่างเซิร์ฟเวอร์แล้วตอบ "N" ในเชลล์ cmd


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

จากนั้นเปลี่ยนpackage.json :

"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

วิธีการนี้ใช้ไม่ได้ผลอย่างไรก็ตามวิธีเหล่านี้นำเสนอในnpmjs.com/package/reload (สำหรับแอปด่วน)
Maxie Berkmann

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

และ config จะทำการโหลดซ้ำโดยอัตโนมัติ :)


มีรุ่นที่ไม่พึ่งพากรอบที่ไม่ได้เป็นส่วนหนึ่งของโหนดหรือไม่?
เอเดรีย

0

loaddir เป็นวิธีแก้ปัญหาสำหรับการโหลดไดเรกทอรีอย่างรวดเร็วแบบเรียกซ้ำ

สามารถกลับมา

{ '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 แทนการใช้ require คุณสามารถบันทึกไฟล์ข้อความที่มีวัตถุ json และสร้างช่วงเวลาบนเซิร์ฟเวอร์เพื่อโหลดวัตถุนี้

ข้อดี:

  • ไม่จำเป็นต้องใช้ libs ภายนอก
  • เกี่ยวข้องกับการผลิต (การโหลดไฟล์การเปลี่ยนแปลงใหม่)
  • ใช้งานง่าย

ข้อเสีย:

  • คุณไม่สามารถโหลดโมดูลใหม่ - เพียงแค่ json ที่มีข้อมูลคีย์ - ค่า

0

สำหรับผู้ใช้ Vagrant และ PHPStorm ตัวตรวจสอบไฟล์เป็นวิธีที่เร็วกว่า

  • ปิดใช้งานการซิงค์ไฟล์ทันทีดังนั้นคุณจึงรันคำสั่งเฉพาะเมื่อบันทึกจากนั้นสร้างขอบเขตสำหรับไฟล์ * .js และไดเรกทอรีการทำงานและเพิ่มคำสั่งนี้

    คนจรจัด ssh -c "/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การพัฒนาเพื่อให้สามารถทำงานในโครงการที่ประกอบด้วยหลายแพ็คเกจได้อย่างมีประสิทธิภาพสิ่งสำคัญคือการเปลี่ยนแปลงที่เกิดขึ้นในการอ้างอิงทำให้เกิดการโหลดซ้ำเช่นกัน

หลังจากลองใช้ node-mon และ pm2 แล้วทำตามคำแนะนำเพื่อดูโฟลเดอร์ node_modules เพิ่มเติมพวกเขายังคงไม่รับการเปลี่ยนแปลง แม้ว่าจะมีโซลูชันที่กำหนดเองในคำตอบที่นี่สำหรับสิ่งนี้แพคเกจแยกต่างหากจะสะอาดกว่า ฉันเจอnode-devวันนี้และมันทำงานได้อย่างสมบูรณ์แบบโดยไม่มีตัวเลือกหรือการกำหนดค่า

จาก Readme:

ตรงกันข้ามกับเครื่องมือเช่นหัวหน้างานหรือ nodemon มันไม่ได้สแกนระบบไฟล์เพื่อดูไฟล์ แต่จะเชื่อมต่อเข้ากับฟังก์ชั่น require () ของโหนดเพื่อดูเฉพาะไฟล์ที่จำเป็นต้องใช้จริง


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

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

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

ฉันลองpm2 แล้ว : การติดตั้งใช้งานง่ายและใช้งานง่ายเกินไป ผลลัพธ์ที่ได้เป็นที่น่าพอใจ อย่างไรก็ตามเราต้องดูแล PM2 รุ่นที่เราต้องการ pm 2 runtime เป็นรุ่นฟรีในขณะที่ pm2 plus และ pm2 enterprise ไม่ฟรี

สำหรับStrongloopการติดตั้งของฉันล้มเหลวหรือไม่สมบูรณ์ดังนั้นฉันจึงไม่สามารถใช้งานได้


-1

ปัจจุบันมีการใช้เซิร์ฟเวอร์ WebPack dev พร้อมตัวเลือกฮอต คุณสามารถเพิ่มสคริปต์แบบนี้ใน package.json ของคุณ:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

และการเปลี่ยนแปลงทุกครั้งในไฟล์ของคุณจะทริกเกอร์การคอมไพล์ใหม่โดยอัตโนมัติ


2
คำตอบนี้เป็นคำถามที่ผิด Webpack สำหรับการใช้งานส่วนหน้าและเซิร์ฟเวอร์ dev เป็นเว็บเซิร์ฟเวอร์ของตัวเอง คำถามถูกอ้างถึงแอพพลิเคชันเซิร์ฟเวอร์ที่นำมาใช้ในโหนด มันไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ มันเป็นหนึ่งแล้ว
DanielKhan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.