这是我如何运行我的 Node.js 服务器。当我对前端代码进行更改时,我需要实时重新加载我的服务器。
"start": "node server.js"
这是我如何运行我的 Node.js 服务器。当我对前端代码进行更改时,我需要实时重新加载我的服务器。
"start": "node server.js"
首先:
npm install -g nodemon
接下来在你的package.json文件中添加一行脚本代码
"live": "nodemon server.js"
现在当你运行npm live时,它将实现页面自动刷新
更多详情请参见https://github.com/remy/nodemon
更新:如果还需要页面自动刷新,请执行相应的更新
npm install -g livereload
livereload . -w 1000 -d
欲了解更多详情,请参见https://github.com/napcs/node-livereload
重启服务器和刷新浏览器是两回事。我使用nodemon来监控服务器,nodemon可以检测到任何类型文件的更改。但是nodemon无法刷新浏览器页面。所以我使用browser sync来做这件事。
我在gulp中同时使用了两者。
所以,为使其正常工作,需要在package.json中添加依赖项:
"devDependencies": {
"browser-sync": "^2.24.5",
"gulp": "^3.9.1",
"gulp-nodemon": "^2.2.1"
}
在服务器文件中(我的服务器文件位于./bin/www,你的可能位于server.js、app.js或其他位置),express 服务器监听端口3001。
var port = normalizePort(process.env.PORT || '3001');
var server = http.createServer(app);
server.listen(port);
接下来需要在gulp中运行nodemon和browser sync。gulpfile.js的完整内容:
var gulp = require('gulp');
var nodemon = require('gulp-nodemon');
var browserSync = require('browser-sync').create();
gulp.task('gulp_nodemon', function() {
nodemon({
script: './bin/www', //this is where my express server is
ext: 'js html css', //nodemon watches *.js, *.html and *.css files
env: { 'NODE_ENV': 'development' }
});
});
gulp.task('sync', function() {
browserSync.init({
port: 3002, //this can be any port, it will show our app
proxy: 'http://localhost:3001/', //this is the port where express server works
ui: { port: 3003 }, //UI, can be any port
reloadDelay: 1000 //Important, otherwise syncing will not work
});
gulp.watch(['./**/*.js', './**/*.html', './**/*.css']).on("change", browserSync.reload);
});
gulp.task('default', ['gulp_nodemon', 'sync']);
在终端中运行gulp时,它将开始监视服务器并在任何文件更改时刷新浏览器。
尽管我们在express服务器中指定了端口3001,但我们的应用程序将在端口3002上运行,因为我们在browser-sync中编写了端口3002。 3001将被用作代理。
gulp.task('default', gulp.series('gulp_nodemon', 'sync'));
。 - kohane15exports.build = gulp.parallel(["gulp_nodemon", "sync"]);
编写exports.build可以在npm脚本中提供“gulp build”命令。 - Dan Engel使用“livereload”、“connect-livereload”和“nodemon”包,您可以将前端和后端更改实时加载到浏览器中。这样您就不需要使用Gulp。以下是这些包的合作方式:
livereload
打开一个高端口并通知浏览器已更改的公共文件connect-livereload
用一小段代码片段来支持每个服务的HTML页面连接到此高端口nodemon
在更改后端文件时重新启动服务器在Express中设置livereload
设置Express同时启动livereload服务器以监视public目录并在nodemon
引起的重启期间与浏览器进行通信:
const livereload = require("livereload");
const connectLivereload = require("connect-livereload");
// open livereload high port and start to watch public directory for changes
const liveReloadServer = livereload.createServer();
liveReloadServer.watch(path.join(__dirname, 'public'));
// ping browser on Express boot, once browser has reconnected and handshaken
liveReloadServer.server.once("connection", () => {
setTimeout(() => {
liveReloadServer.refresh("/");
}, 100);
});
const app = express();
// monkey patch every served HTML so they know of changes
app.use(connectLivereload());
使用nodemon启动Express
使用nodemon启动服务器,例如使用一个专门的watch脚本npm run watch
。
关键点是要忽略已经被livereload监视的public目录。您还可以配置非默认扩展名的文件,如pug和mustache进行监视。
"scripts": {
"start": "node ./bin/www",
"watch": "nodemon --ext js,pug --ignore public"
},
你可以在"使用Express、LiveReload和Nodemon使前端和后端变化实时呈现在浏览器中"中阅读更长的解释。
ReferenceError: path is not definedLiveReload 是如何启动的? - GBMan
const path = require("path")
来引入它。很多时候,这已经包含在应用程序设置中处理路径的过程中了。 - pspinpm install browser-refresh -g
并添加你的主要js文件
if (process.send) {
process.send('online');
}
app.listen(port, function() {
console.log('Listening on port %d', port);
if (process.send) {
process.send('online');
}
});
<script src="{process.env.BROWSER_REFRESH_URL}"></script>
browser-refresh server.js
我的设置中有一个例子:
livereload.js(也就是您的server.js,当然只使用与livereload相关的部分,无需替换您的开发服务器)
const path = require('path');
const fs = require('fs');
const livereload = require('livereload');
const lrserver = livereload.createServer();
const compiled = path.join( __dirname, "dist");
lrserver.watch( compiled );
const connect = require('connect');
const stat = require('serve-static');
const server = connect();
server.use( stat( compiled ));
server.listen( 3033 );
console.log( 'Dev server on localhost:3033' );
实际上,它会在本地主机上启动两个服务器:监听:35729
的livereload服务器和监听:3033
的静态文件服务器。
Livereload观察包含编译后文件(js、css、html)的dist
目录。您需要将以下片段添加到每个应该重新加载的HTML页面中:
<script>
document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] +
':35729/livereload.js?snipver=1"></' + 'script>');
</script>
"scripts": {
"build": "npm run build:js && npm run build:css",
"prewatch": "node livereload.js &",
"watch": "node ./node_modules/watch-run/bin/watch -p './src/**' npm run build",
},
"devDependencies": {
"connect": "^3.6.2",
"livereload": "^0.6.2",
"serve-static": "^1.12.3",
"watch-run": "^1.2.5"
}
$ npm run watch
命令用于构建项目并启动livereload和静态文件服务器。(为了简洁起见,省略了build:*
任务)。
使用Node.js 19,您可以通过--watch
选项监控文件更改。文件更改后,进程会自动重新启动,反映新的更改。
"start": "node --watch server.js"
grunt
,则有一个名为 grunt-contrib-watch
的 npm 包可用于实时重新加载。grunt-express-server
的包可以与其配合使用。使用名为livereload的npm包。
与nodemon一起使用,以便客户端和服务器端都能无缝运行。
npm install livereload nodemon --save
--save-dev。我知道,我知道!
添加浏览器扩展程序。适用于Safari、Firefox和Google Chrome。 在这里获取它们。
确保将此脚本放在package.json
中。
"scripts": {
"start": "nodemon server.js && livereload"
}
server.js
是我的入口点。
在server.js
中添加以下内容:
const livereload = require('livereload');
const reload = livereload.createServer();
reload.watch(__dirname + "/server.js");
server.js
是我想要实现浏览器自动刷新的文件。你也可以添加任意目录,而不仅仅是一个文件。
reload.watch(__dirname + "/public");
npm start
点击浏览器中的扩展图标进行连接。
你也可以在不同的终端中分别使用livereload和nodemon。"scripts": {
"start": "nodemon server.js",
"livereload": "livereload"
}
npm start
npm livereload
如果默认端口已被使用,可以使用
npm livereload -p PORT_NUMBER
。
更新:有时保存后无法立即生效。多按几次Ctrl+S重新加载即可使更改生效。我不知道这是浏览器缓存问题还是软件包问题。
你可以使用nodemon。
它会监视你的项目文件,并在你更改它们时重新启动服务器。
你可以全局安装它:
npm install -g nodemon
在你的项目目录下运行它
cd ./my-project
nodemon
你也可以将它添加到项目的开发依赖中,并从npm脚本中使用:
npm install --save-dev nodemon
package.json
中添加一个简单的脚本:"scripts": {
"start": "node server.js",
"dev": "nodemon"
}
然后您可以简单地运行以下命令:
npm run dev
react-dev-utils
包(https://github.com/facebook/create-react-app/blob/main/packages/react-dev-utils/openBrowser.js)
nodemon
的工具来重建你的服务器。react-dev-utils
:import openBrowser from "react-dev-utils/openBrowser";
import express from "express";
const app = express();
app.get("/foo", (req, res) => res.send("hello: " + new Date().toISOString()));
app.listen(3000, () => {
console.debug(`Running on http://localhost:3000`);
// this will open a new browser tab or reload the open one
openBrowser(`http://localhost:3000`);
});