node.js - 使用 CORS 时如何将 html、css 和 js 作为发布响应提供服务?
问题描述
试图了解通过 Post 请求将 html、css、js 文件发送回客户端的最佳方法。我正在运行快递,反应。
到目前为止,我所拥有的是一个基本的发布路线,它返回带有数据(使用把手)作为响应的已编译组件。但是,没有事件处理程序、css 和 js。我不确定如何将这些与 HTML 一起作为对另一个域上的 AJAX POST 请求的响应。
我正在将 webpack 用于 SSR,并认为这会起到很大的作用,但事实并非如此。
这是我到目前为止所拥有的......这只是从我的反应组件返回 html。
app.post("/", async (req, res) => {
const theHtml = `
<html>
<head><title>My First SSR</title>
<link href='http://localhost:8080/app.css'></link>
<script src="http://localhost:8080/app.js" charset="utf-8"></script>
<script src="http://localhost:8080/vendor.js" charset="utf-8"></script>
</head>
<body>
<h1>My First Server Side Render</h1>
<div id="reactele">{{{reactele}}}</div>
</body>
</html>
`;
const hbsTemplate = hbs.compile(theHtml);
const reactComp = renderToString(<App />);
const htmlToSend = hbsTemplate({ reactele: reactComp });
res.send(htmlToSend);
});
上面的工作,只返回没有 js,css 事件处理程序等。这里是 App 组件
class App extends React.Component {
constructor() {
super();
this.handleButtonClick = this.handleButtonClick.bind(this);
this.handleTextChange = this.handleTextChange.bind(this);
this.handleReset = this.handleReset.bind(this);
this.state = {
name: "",
msg: ""
};
}
//Handlers
handleButtonClick = e => {
const nameLen = this.state.name.length;
if (nameLen > 0) {
this.setState({
msg: `You name has ${nameLen} characters including space`
});
}
};
handleTextChange = e => {
this.setState({ name: e.target.value });
};
handleReset = () => {
this.setState({ name: "", msg: "" });
};
//End Handlers
render() {
let msg;
if (this.state.msg !== "") {
msg = <p>{this.state.msg}</p>;
} else {
msg = "I have a state of none";
}
return (
//do something here where there is a button that will replace the text
<div>
<header className="App-header">
{/* <img src={logo} className="App-logo" alt="logo" /> */}
{/* <img src={logo} className="App-logo" alt="logo" /> */}
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
<label>Your name </label>
<input
type="text"
id="txtName"
name="txtName"
value={this.state.name}
onChange={this.handleTextChange}
/>
<button id="btnSubmit" onClick={this.handleButtonClick}>
Calculate Name Length
</button>
<button id="btnReset" onClick={this.handleReset}>
Reset All
</button>
<hr />
{msg}
</div>
);
}
}
export default App;
在客户端,我只是将 html 附加到空白页面。几个问题,
如何维护请求的 html 上的事件处理程序?如何同时发送 .css 和 .js ?
在某些情况下,我想避免在我的前端服务器上放置和维护“客户端”代码?我希望像 webpack 这样的东西会为我处理这个问题?
感谢您的任何提示/建议。
编辑:: 如果我直接访问该路线,澄清这一点。我得到了相关的 js 和 css。只是不是通过来自另一个域的发布请求。我假设我缺少一些基本的 udnerstanding dom 是如何维护和脚本运行的。
解决方案
您只需要一个静态目录和一个视图渲染器。
在您的 app.js 或您初始化 express 实例的任何地方,添加以下内容
var hbs = require('hbs');
var path = require('path');
var express = require('express');
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
现在您可以将您的 html 放入名为“views”的文件夹中的 hbs 文件中,然后将其返回
app.post("/", (req, res) => {
res.render('index.hbs', {variable: 'value'});
});
对于静态资产,添加以下行
app.use(express.static(path.join(__dirname, 'public')));
并将您的 js 和 css 或图像或任何您想要的静态文件放在项目根目录中名为“public”的文件夹中。这些可以通过http://localhost:8080/app.js访问
推荐阅读
- c# - 在 TimeSeriesPredictionEngine ML.NET 时间序列 ForecastbySsa 中使用 DateTime 预测值
- python-3.x - 比较两个列表元素的更快方法
- javascript - 在 notify.js 中完成 HTML
- java - APK 不工作 膨胀 NavigationView 时出错
- django - 序列化来自另一个模型的特定字段
- java - 如何获取在我的 spring 错误控制器中抛出的异常类
- scala - 如何过滤列表哪些元素以非降序排列
- slurm - 提交后更改 slurm bash 脚本(我想更改队列作业的脚本以避免重新提交)
- r - Flexdashboard - 两个情节和一个表格,一个情节在情节提要框架中缩小
- webpack - 无法使新版本的暴露加载器和样式加载器工作