使用 CDN 将 React 集成到现有的 Node Express 应用程序中

Integrate React into existing Node express app using CDN

我正在使用 node 和 React 创建一个网络应用程序。我不想将 Node 和 React 应用程序分开,而是想将 React 集成到其中。因此,我尝试将 React CDN 导入 index.html,而不是 React 应用程序。我的服务器完美地服务于 index.html,但我在反应组件中遇到错误。

这是我的index.html

<html>
  <head>
    <meta charset="utf-8">
    <title>React Powered chat App</title>
  </head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.development.js"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.development.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js" charset="utf-8"></script>
  <script src="/scripts/main.js" charset="utf-8"></script>
  <body>
    Hello !
    <div id ='App'></div>
  </body>
</html>

这是我的 main.js

class App extends React.Component {
  render(){
    return (
      <div>
        Hello !
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('App'));

我得到的错误是

Uncaught SyntaxError: Unexpected token <                     main.js:4

我做错了什么?不能使用与 CDN 的反应吗?

首先,当我使用 react/cjs/react.development 库时,我遇到了更多错误。然后在阅读 this Whosebug 问题后,我使用 /react/umd/ 库。那么 cjsumd CDN 库有什么区别?

由于 JSX(散布在 JavaScript 中的 HTML 代码)不是常规 JavaScript 或 ES6 代码,因此您无法直接在浏览器中加载它。

所以问题不是从 CDN 获取 React 库,没关系。

问题是您必须将 main.js 文件转换为常规 JavaScript 代码,例如使用 Babel。

使用 Babel 自动执行此转换的最常用工具是 webpack。

如果你不想详细了解如何设置 webpack 和 Babel,我建议使用 create-react-app,这会减轻你设置所有样板文件的负担,并创建一个JavaScript 可以直接在浏览器中使用的包。

注意:如果你最终使用 create-react-app,你不需要从 CDN 获取 React 库,它已经包含在捆绑。

代码无法运行,因为react使用了JSX(HTML inside javascript),无法被浏览器读取,需要转译为普通的javascript可以被浏览器读取。一个这样的转译器是 babel。由于缺少转译器,您的代码无法正常工作。

您可以使用 create-react-app, which comes bundled with the transpiler and everything that you'll need to get started with react. And as I understand, since you want to add your express backend, here is a tutorial 来帮助您开始将 create-react-app 附加到您的 express 后端。希望这有帮助。

您还需要在 Html 文件中添加 babel cdn,它将 JSX 转换为 JS

 <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>