zoukankan      html  css  js  c++  java
  • express+monogodb+前台react JSX模板引擎相关配置(非webapck)服务端渲染

    项目构建

    背景:由于国外学生需要用node构建前台使用jsx,后台数据库使用monogodb,而国内的文章基本node+JSX使用webpack相关配置,所以爬坑建立该方案,
    前台JSX使用服务端渲染

    1.使用express生成项目

    1.安装 express

      1.应用生成器工具 express-generator 可以快速创建一个应用的骨架。

      $ npm install express-generator -g

      2.如下命令创建了一个名称为 myapp 的 Express 应用。此应用将在当前目录下的 myapp 目录中创建,并且设置为使用 Pug 模板引擎(不带模板引擎--no-view)

    $ express --view=pug myapp

      3.然后安装所有依赖包:

    $ cd myapp $ npm install

      4.通过如下命令启动此应用:

    npm start

    2.配置自动化刷新页面

    npm install --save-dev nodemon

      修改 package.json 的 scripts 内容:

    "scripts": {    
        "start": "node ./bin/www",    
        "devstart": "nodemon ./bin/www"  
    }
    

    此处mpapp为文件夹名称需要更换

    SET DEBUG=myapp:* & npm run devstart

    我的启动配置项

    package.json

      "scripts": {
        "start": "node ./bin/www",
        "devstart": "nodemon ./bin/www",
        "dev": "SET DEBUG=REACTAPP:* & npm run devstart"
      },
    

    根目录创建nodemon.json代码如下:

    {
        "restartable": "rs",
        "ignore": [
            ".git",
            ".svn",
            "node_modules/**/node_modules"
        ],
        "verbose": true,
        "execMap": {
            "js": "node --harmony"
        },
        "watch": [
     
        ],
        "env": {
            "NODE_ENV": "development"
        },
        "ext": "js json jsx"
    }
    

    执行npm run dev 即可

    缺点:可以监听到jsx变化服务不需要重启,但页面还是需要手动刷新

    3.使用包express-react-views配置JSX

    npm install express-react-views react react-dom
    

    注意:您必须显式安装react为依赖项。从v0.5开始,react这里是一个对等依赖项。这是为了避免使用不兼容版本时可能出现的问题。

    将其添加到您的应用程序。

    // app.js
    
    var app = express();
    
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jsx');
    app.engine('jsx', require('express-react-views').createEngine());
    

    4.安装react相关依赖

    cnpm install react react-dom axios --save-dev

    5.安装babel相关配置

    需要配置babel否则无法正常执行,使用以下配置,不同版本容易报错

        "@babel/core": "^7.7.2",
        "@babel/preset-env": "^7.7.1",
        "@babel/preset-react": "^7.7.0",
        "@babel/register": "^7.7.0",
    

    配置babel 可以在package.json内配置

      "babel": {
        "presets": [
          [
            "@babel/preset-env",
            {
              "useBuiltIns": "entry",
              "corejs": 3
            }
          ],
          "@babel/preset-react"
        ]
      },
    

    在app.js内添加如下代码

      // automatically bundle the front-end js on the fly
      // note: this should come before the express.static since bundle.js is in the public folder
    const isDev = (app.get('env') === 'development');
    console.log(isDev)
    const browserifyier = expressBrowserify('./public/scripts/bundle.jsx', {
        watch: isDev,
        debug: isDev,
        extension: ['jsx'],
        transform: ['babelify'],
      });
    if (!isDev) {
        browserifyier.browserify.transform('uglifyify', { global: true });
    }
    app.get('/scripts/bundle.js', browserifyier);
    

    在静态资源目录下创建bundle.jsx

    import React from 'react';
    import ReactDOM from 'react-dom';
    import Demo from '../../views/demo.jsx';
    
    ReactDOM.render(<Demo />, document.getElementById('root'));
    
    

    在视图模板内写入以下代码

    index.jsx

    import React from 'react';
    import Demo from './demo';
    import Layout from './layout';
    export default function Index() {
      return (
        <Layout>
            <Demo />
        </Layout>
          
      );
    }
    

    layout.jsx

    import React from 'react';
    import PropTypes from 'prop-types';
    
    export default function Layout({ children }) {
      return (
        <html lang="en">
          <head>
            <title>
              Demo
            </title>
            <meta charSet="utf-8" />
            <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
            <meta name="viewport" content="width=device-width, initial-scale=1" />
          </head>
          <body>
            <div id="root">
              {children}
            </div>
            <script type="text/javascript" src="scripts/bundle.js"></script>
          </body>
        </html>
      );
    }
    
    Layout.propTypes = {
      children: PropTypes.object.isRequired, // eslint-disable-line
    };
    
    

    demo.jsx 示例

    import React from "react";
    
    class MyComponent extends React.Component{
        render() {
            let props = this.props;
            this.state={
                number: 0
            };
            return (
                <button onClick={(event)=>{console.log(this.state.number)}}> dsaasdasd</button>
            )
        }
    }
    export default MyComponent;
    
    

    可以正常运行代码和绑定事件

    github代码地址:https://github.com/WebZhouT/react-express

  • 相关阅读:
    .net做UG NX二次开发(VB.net) / NX Secondry Dev. with .net using VB.net Code
    UGS Object ID 工具 [开源]
    Build a NX Open .NET application
    Open C、Open C++和NXOpen C++混合开发
    UG二次开发技术的研究
    ufun视频教程
    互联网上的阴暗战争
    谈谈UG二次开发的Open和NXOpen
    IBM云计算平台下 Windows Server 2003虚拟机的使用
    使用IBM云计算平台虚拟机
  • 原文地址:https://www.cnblogs.com/NB-JDzhou/p/13723376.html
Copyright © 2011-2022 走看看