- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
截至目前,我已经为 MERN 应用程序设置了样板,该应用程序在后端有一个快速服务器并在前端使用react。我打算在我的应用程序中设置热重载——每当 react 代码发生任何变化时,无需刷新整个应用程序 (HMR)。
我安装了 webpack-dev-server
和 HotModuleReplacementPlugin
。我还尝试在 package.json
的 webpack
脚本中使用 --hot
。如果我运行 npm run webpack
,代码会编译,服务器会在 localhost:8080
上启动。它给了我这样的东西,这不是我真正想要的。我不知道它看起来像是在向我显示根目录。
另一方面,如果我运行 npm start
,服务器会启动并显示 react 组件,这正是我想要的,但带有热重载。现在,我必须刷新页面才能看到更改。
所以,我想了解到底发生了什么?有没有办法在我输入 npm start
时添加热重载?
客户端/index.js
import React from "react"
import ReactDOM from "react-dom"
import App from "./containers/App"
ReactDOM.render(<App />, document.getElementById("root"))
客户端/容器/App.js
class App extends Component {
render() {
return (
<div>
<Router>
<Switch>
<Route exact path="/" component={HomePage} />
</Switch>
</Router>
</div>
)
}
}
export default App
client/components/HomePage.js
const HomePage = () => {
return (
<div>
<h1>React HomePage</h1>
</div>
)
}
export default HomePage
routes/index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/*', function(req, res, next) {
res.render('index', { title: 'Travel Forum' });
});
module.exports = router;
views/index.ejs
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<div id="root"></div>
<script src="/static/bundle.js"></script>
</body>
</html>
package.json
"scripts": {
"start": "NODE_ENV=development nodemon ./bin/www",
"webpack": "webpack-dev-server --config ./webpack.config.js --mode development --hot"
},
webpack.config.js
/* eslint-disable */
var webpack = require("webpack")
var path = require("path")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
module.exports = {
mode: "development",
devtool: "inline-source-map",
entry: ["./client/index.js"],
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: { loader: "babel-loader" },
},
{
test: /\.(scss|css)$/,
use: [
{ loader: MiniCssExtractPlugin.loader },
{
loader: "css-loader",
},
{ loader: "sass-loader" },
],
},
{
test: /\.(png|jpg|gif|jpeg)$/,
use: [
{
loader: "file-loader",
options: {},
},
],
},
],
},
resolve: {
extensions: [".js", ".jsx"],
},
output: {
filename: "bundle.js",
path: __dirname + "/dist/bundle/",
publicPath: "/static/",
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("development"),
},
}),
new MiniCssExtractPlugin({
filename: "bundle.css",
}),
],
}
app.js
const createError = require("http-errors")
const express = require("express")
const bodyParser = require("body-parser")
const path = require("path")
const cookieParser = require("cookie-parser")
const logger = require("morgan")
const mongoose = require("mongoose")
const indexRouter = require("./routes/index")
const userRouter = require("./routes/users")
const app = express()
// view engine setup
app.set("views", path.join(__dirname, "views"))
app.set("view engine", "ejs")
app.use(logger("dev"))
app.use(express.json())
app.use(bodyParser.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, "public")))
if (process.env.NODE_ENV === "development") {
const webpack = require("webpack")
const webpackConfig = require("./webpack.config")
const compiler = webpack(webpackConfig)
app.use(
require("webpack-dev-middleware")(compiler, {
noInfo: true,
publicPath: webpackConfig.output.publicPath,
})
)
app.use(require("webpack-hot-middleware")(compiler))
}
mongoose.connect(
"mongodb://localhost:27017/travel-forum",
{ useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false },
function (err) {
if (err) {
console.log("Not connected to the database")
} else {
console.log("Connected to the database")
}
}
)
app.use("/api/v1/users", userRouter)
app.use("/*", indexRouter)
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404))
})
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message
res.locals.error = req.app.get("env") === "development" ? err : {}
// render the error page
res.status(err.status || 500)
res.render("error")
})
module.exports = app
最佳答案
** 我是通过以下方式解决的:**
express 有两个模块,你可以在不刷新浏览器的情况下安装热刷新,它会自动刷新:我把我的配置留给你。
npm i livereload
npm i connect-livereload
const livereload = require('livereload');
const connectLivereload = require('connect-livereload');
const liveReloadServer = livereload.createServer();
liveReloadServer.watch(path.join(__dirname, '..', 'dist', 'frontend'));
const app = express();
app.use(connectLivereload());
请注意,您要监控的文件夹位于 dist/frontend 中。更改您要监视的文件夹以使其工作:要监视后端,我正在使用 NODEMON
livereload 在后端为浏览器打开一个端口以公开更改:连接是如何发生的?这很容易;用“connect-livereload”表达并注入(inject)一个脚本来监视该端口:如果发生变化,浏览器会收到 express 通知,浏览器会为您刷新。
我留下的信息尽可能简单以供测试,我不建议这样使用它:要使用它,您必须将开发环境和生产环境分开。我保持简单,以便于理解。
我在这里留下我找到的最相关的链接:我希望它也能有所帮助。
https://bytearcher.com/articles/refresh-changes-browser-express-livereload-nodemon/
关于javascript - 使用快速服务器在 React 应用程序中热重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62403571/
我正在通过 labrepl 工作,我看到了一些遵循此模式的代码: ;; Pattern (apply #(apply f %&) coll) ;; Concrete example user=> (a
我从未向应用商店提交过应用,但我会在不久的将来提交。 到目前为止,我对为 iPhone 而非 iPad 进行设计感到很自在。 我了解,通过将通用PAID 应用放到应用商店,客户只需支付一次就可以同时使
我有一个应用程序,它使用不同的 Facebook 应用程序(2 个不同的 AppID)在 Facebook 上发布并显示它是“通过 iPhone”/“通过 iPad”。 当 Facebook 应用程序
我有一个要求,我们必须通过将网站源文件保存在本地 iOS 应用程序中来在 iOS 应用程序 Webview 中运行网站。 Angular 需要服务器来运行应用程序,但由于我们将文件保存在本地,我们无法
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
假设我有一个安装在用户设备上的 Android 应用程序 A,我的应用程序有一个 AppWidget,我们可以让其他 Android 开发人员在其中以每次安装成本为基础发布他们的应用程序推广广告。因此
Secrets of the JavaScript Ninja中有一个例子它提供了以下代码来绕过 JavaScript 的 Math.min() 函数,该函数需要一个可变长度列表。 Example:
当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我传递对象和数组时,我得到一个数字。为什么会发生这种情况? 由于数组也被视为对象,为什么我无法使用它
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章ASP转换格林威治时间函数DateDiff()应用由作者收集整理,如果你
我正在将列表传递给 map并且想要返回一个带有合并名称的 data.frame 对象。 例如: library(tidyverse) library(broom) mtcars %>% spl
我有一个非常基本的问题,但我不知道如何实现它:我有一个返回数据框,其中每个工具的返回值是按行排列的: tmp<-as.data.frame(t(data.frame(a=rnorm(250,0,1)
我正在使用我的 FB 应用创建群组并邀请用户加入我的应用群组,第一次一切正常。当我尝试创建另一个组时,出现以下错误: {"(OAuthException - #4009) (#4009) 在有更多用户
我们正在开发一款类似于“会说话的本”应用程序的 child 应用程序。它包含大量用于交互式动画的 JPEG 图像序列。 问题是动画在 iPad Air 上播放正常,但在 iPad 2 上播放缓慢或滞后
我关注 clojure 一段时间了,它的一些功能非常令人兴奋(持久数据结构、函数式方法、不可变状态)。然而,由于我仍在学习,我想了解如何在实际场景中应用,证明其好处,然后演化并应用于更复杂的问题。即,
我开发了一个仅使用挪威语的应用程序。该应用程序不使用本地化,因为它应该仅以一种语言(挪威语)显示。但是,我已在 Info.plist 文件中将“本地化 native 开发区域”设置为“no”。我还使用
读完 Anthony's response 后上a style-related parser question ,我试图说服自己编写单体解析器仍然可以相当紧凑。 所以而不是 reference ::
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,它们不会随着控制台继续滚动而丢失)。一种方法是使用 sink() 和 file.show()。例如: y <- rnorm(100); x <- r
我有一个如下所示的 spring mvc Controller @RequestMapping(value="/new", method=RequestMethod.POST) public Stri
我正在阅读 StructureMap关于依赖注入(inject),首先有两部分初始化映射,具体类类型的接口(interface),另一部分只是实例化(请求实例)。 第一部分需要配置和设置,这是在 Bo
我是一名优秀的程序员,十分优秀!