React+NodeJS+Express 环境搭建与部署

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 链接Mac安装nodejs和npm替换为cnpm使用create-react-app快速构建开发环境使用npm init创建项目配置webstorm安装nodemon使用webpack部署神器pm2部署到Linux1 链接个人博客: alex-my.xyzCSDN: blog.csdn.net/alex_my前面 2-8


1 链接

个人博客: alex-my.xyz

CSDN: blog.csdn.net/alex_my

前面 2-8 章都是将本地开发设置
第 10 章 是部署到外网服务器上

2 Mac安装node.js和npm

  • Mac下通过brew安装

    brew install node

    当前官网推荐版本为 v6.11.0 LTS,直接使用brew安装的版本为v6.3.1。

    我这里使用这种方法。

  • 下载安装包安装
    Node.js 中文网 下载速度快,但不一定是最新的,当前v8.1.0。

    Node 官网 最新版本v8.1.1。

    使用源码的安装方式的见 10 部署到Linux

  • 现在的node.js已经集成了npm。

3 替换为cnpm

国内使用npm速度较慢,可以使用淘宝定制的cnpm。

npm install -g cnpm --registry=https://registry.npm.taobao.org
npm config set registry https://registry.npm.taobao.org

4 使用create-react-app快速构建开发环境

cnpm install -g create-react-app
create-react-app my-learn
cd my-learn

安装后会出现:

npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

等待一小段时候后可以看见Compiled successfully!
启动后会自动打开浏览器 http://localhost:3000

5 使用npm init创建项目

  • 按照网上所说,使用cnpm init初始化一个项目。会生成package.json文件。
  • 不过我这台mac下使用该命令会在version阶段卡死,我这边使用的是 cnpm init -y
  • 然后执行cnpm install babel-cli --save-devcnpm install
  • 这样会得到node_modules文件夹和package.json文件
  • 我这里后面学习时使用的还是基于create-react-app创建的工程,小项目直接使用webstorm创建工程。

6 配置webstorm

  • 创建工程,Node.js Express APP
    • Template 选 EJS
    • css 选 SASS
  • 进入Languages & Frameworks - JavaScript - Libraries
  • 点击Download…
  • 弹出框刚弹出来的时候会显示 ‘Fetching a list of libraires …’。
  • 等待一段时间后,出现一个列表,选择node进行下载。
  • 进入Languages & Frameworks - Node.js and NPM,在Coding Assistance中选择Enable。

7 安装nodemon

  • 为了避免每次修改文件都要重新手动启动,可以安装一个nodemon
  • cnpm install nodemon –save
  • 将原来的 node app.js 替换为 nodemon app.js
  • 对于使用了Express 4.xx框架的,应该执行 nodemon ./bin/www,否则打不开网页的。但是只执行这个命令,却达不到自动更新的目的。还要另开终端执行webpack –watch, 这样,又变的没意义了。

8 使用webpack

  • 安装

    npm install webpack --save -g
  • 在根目录下创建一个文件: webpack.config.js, 内容如下

    let path=require("path");
    
    module.exports={
        entry:  "./public/javascripts/index.jsx",
        output:
            {
                path: path.join(__dirname,"./public/out"),
                filename: "bundle.js",
                publicPath: "./public/out/"
            },
        module:
            {
                loaders: [
                    {
                        test: /\.js$/,
                        loader: "babel-loader",
                        query:
                            {
                                presets: ['react','es2015']
                            }
                    },
                    {
                        test: /\.jsx$/,
                        loader: 'babel-loader',
                        query:
                            {
                                presets: ['react', 'es2015']
                            }
                    },
                    {
                        test: /\.css$/,
                        loader: "style-loader'!css-loader"
                    },
                    {
                        test: /\.(jpg|png|otf)$/,
                        loader: "url?limit=8192"
                    },
                    {
                        test: /\.scss$/,
                        loader: "style-loader!css-loader!sass-loader"
                    }
                ]
            }
    };
    • 配置文件解释以及index.jsx,请自行搜索,根据项目不同内容也不同。
  • 打包
    进入 webpack.config.js所在目录
    执行

    webpack --watch     // 监听变动并自动打包
    
    webpack -p          // 压缩混淆脚本,这个非常非常重要!
    
    webpack -d          // 生成map映射文件,告知哪些模块被最终打包到哪里了

9 部署神器pm2

  • 常用命令参考

    命令 说明
    pm2 start app.js 启动应用
    pm2 list 列出所有应用
    pm2 monit 查看资源消耗
    pm2 describe [app/id] 查看某一个应用的状态
    pm2 logs 查看所有日志
    pm2 restart [app/id] 重启应用
    pm2 stop [app/id/all] 停止应用
    pm2 web 访问 url:9615

  • pm2-web

    • 安装npm install -g pm2-web
    • 默认可以直接运行pm2-web, 会使用默认的配置,然后在终端中会告诉你地址和端口,比如0.0.0.0:9000。终端也会输出一份默认配置。
    • 也可以自己指定配置,比如新建一个文件pm2-web-config.json

      "www": {
          "host": "localhost",
          "address": "0.0.0.0",
          "port": 8080
      }
    • 指定配置运行: pm2-web --config pm2-web-config.json

10 部署到Linux

  • linux 升级gcc

    • 因为安装node.js的时候有一个警告 C++ compiler too old, need g++ 4.8 or clang++ 3.4.2 (CXX=g++)
    • 系统自带的是 4.4.7, 如果你的是4.8的,可以忽略了。
    • 进入 https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc,拷贝链接
    • 选择了4.8。
    wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2
    tar -jxvf gcc-4.8.5.tar.bz2
    cd gcc-4.8.5
    ./contrib/download_prerequisites
    cd ..
    mkdir gcc-build-4.8.5
    cd gcc-build-4.8.5/
    ../gcc-4.8.5/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
    // 多核CPU可以带上 -j N 参数, N=核数
    make -j4
    // root权限
    make install
    // 修改 /usr/bin中的
    mv /usr/bin/gcc /usr/bin/gcc-4.4.7
    mv /usr/bin/g++ /usr/bin/g++-4.4.7
    ln -s /usr/local/bin/gcc /usr/bin/gcc
    ln -s /usr/local/bin/g++ /usr/bin/g++
    // 修改库
    cp /usr/local/lib64/libstdc++.so.6.0.19 /usr/lib64/
    ln -s libstdc++.so.6.0.19 libstdc++.so.6
  • linux 安装node.js

  • linux 安装 pm2

    npm install pm2 -g
  • linux 安装 mongodb

    进入 https://www.mongodb.com/download-center?jmp=homepage#community 拷贝链接
    这里选择 RHEL 6 Linux 64-bit x64

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.5.tgz
    tar -zxvf mongodb-linux-x86_64-rhel62-3.4.5.tgz
    // 默认数据路径 /data/db
    mkdir /data
    mkdir /data/db
    
    # 以守护进程方式运行
    
    ./mongod --fork --dbpath /data/db  --logpath /var/log/mongodb.log
    • 如果报错 ERROR: child process failed, exited with error number 1
    • #define EPERM 1 /* Operation not permitted */
    • 请更换数据库dbpath的地址
  • github上创建工程,并且将项目提交

  • github 项目的 Settings - Deploy keys - Add deploy, 添加linux的公钥。
  • 将github加入到服务器的known_hosts

    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  • 本地项目中配置pm2

    • 在项目根目录输入 pm2 ecosystem, 自动生成文件 ecosystem.config.js
    • ecosystem.config.js配置如下

      module.exports = {
        /**
         * Application configuration section
         * http://pm2.keymetrics.io/docs/usage/application-declaration/
         */
        apps : [
      
          // First application
          {
            name      : 'react-note',
            script    : './bin/www',
            instances : 4,
            exec_mode : 'cluster',
            max_memory_restart: "300M",
            env: {
              COMMON_VARIABLE: 'true'
            },
            env_production : {
              NODE_ENV: 'production'
            }
          },
        ],
      
        /**
         * Deployment section
         * http://pm2.keymetrics.io/docs/usage/deployment/
         */
        deploy : {
          production : {
            user : 'root',                        # 也可以useradd另建用户
            host : '121.201.x.x',                 # 服务器地址
            ref  : 'origin/master',
            repo : 'git@github.com:xx/xx.git',    # github上的项目地址
            path : '/data/nodejs/production',     # 服务器上放项目的目录
            'post-deploy' : 'npm install && pm2 startOrRestart ecosystem.config.js --env production'
          },
          dev : {
            user : 'alex',
            host : '127.0.0.1',
            ref  : 'origin/master',
            repo : 'git@github.com:alex-my/react-note.git',
            path : '/Code/nodejs/dev',
            'post-deploy' : 'npm install && pm2 startOrRestart ecosystem.config.js --env dev',
            env  : {
              NODE_ENV: 'dev'
            }
          }
        }
      };
      
    • 本地执行以下命令,用于部署设置

      pm2 deploy ecosystem.config.js production setup

      这需要等待一段时间,如果怀疑卡死的,请到服务器上的安装目录,我这里是/data/nodejs/production,进入后执行 du -sh * ,看到文件夹不断变大,就知道不是卡死了。

    • 需要注意的是,对应的ssh端口是默认的22。
    • 部署设置完毕后,执行以下命令进行部署

      pm2 deploy ecosystem.config.js production
    • 执行成功后,输出:

      ┌────────────┬────┬─────────┬──────┬────────┬─────────┬────────┬──────┬───────────┬──────────┐
      │ App nameid │ mode    │ pid  │ status │ restart │ uptime │ cpu  │ mem       │ watching │
      ├────────────┼────┼─────────┼──────┼────────┼─────────┼────────┼──────┼───────────┼──────────┤
      │ react-note │ 0  │ cluster │ 1570 │ online │ 00s     │ 86%  │ 23.3 MB   │ disabled │
      │ react-note │ 1  │ cluster │ 1571 │ online │ 00s     │ 95%  │ 22.6 MB   │ disabled │
      │ react-note │ 2  │ cluster │ 1576 │ online │ 00s     │ 100% │ 22.6 MB   │ disabled │
      │ react-note │ 3  │ cluster │ 1582 │ online │ 00s     │ 94%  │ 23.2 MB   │ disabled │
      └────────────┴────┴─────────┴──────┴────────┴─────────┴────────┴──────┴───────────┴──────────┘
       Use `pm2 show <id|name>` to get more details about an app
        ○ hook test
        ○ successfully deployed origin/master
      --> Success
      
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
18天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
20天前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
36 1
|
1月前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
29天前
|
JavaScript C++ 容器
【Azure Bot Service】部署NodeJS ChatBot代码到App Service中无法自动启动
2024-11-12T12:22:40.366223350Z Error: Cannot find module 'dotenv' 2024-11-12T12:40:12.538120729Z Error: Cannot find module 'restify' 2024-11-12T12:48:13.348529900Z Error: Cannot find module 'lodash'
40 11
|
17天前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
56 1
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
1月前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
41 0
|
1月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。