node.js支持es6的方法及pm2下使用babel-node支持es6

1 篇文章 0 订阅

https://blog.csdn.net/wushichao0325/article/details/85262063

nodejs之使用babel支持es6和pm2下使用babel
步骤一:安装pm2
步骤二:安装babel相关模块
步骤三:测试babel是否能够正常使用
步骤四:配置pm2
总结
步骤一:安装pm2
通过npm全局模式安装:

npm install -g pm2


步骤二:安装babel相关模块
 

npm install --save babel-core
npm install --save babel-preset-env或者es2015
npm install babel-cli -g


安装完成之后,务必要在根目录创建.babelrc文件,内容如下:

{
    "presets": [
     "env"或者"es2015"
    ],
    "plugins": []
}


步骤三:测试babel是否能够正常使用
1.创建一个Person.js,代码如下:

class Person{
    constructor(){
        this.name="haha"
    }
    get(){
        return this.name;
    }
}
export default Person;


2.创建一个app.js,代码如下:

import Person from './Person'
var express=require('express');
var app=express();
let person=new Person();
app.listen(4000,function(){
    console.log("开启4000服务器:",person.get())
})


3.执行app.js
使用node app.js
会抛异常:

import Person from './Person';
^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at loader (E:\nvm\nvm\npm\node_modules\babel-cli\node_modules\babel-register\lib\node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (E:\nvm\nvm\npm\node_modules\babel-cli\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at Object.<anonymous> (E:\nvm\nvm\npm\node_modules\babel-cli\lib\_babel-node.js:154:22)


使用babel-node app.js
正常执行:

开启4000服务器: haha


但是我们在正规部署node服务器的时候,往往会交给进程守护工具如pm2去管理我们的服务器,所以怎么让pm2去使用babel-node执行我们的服务呢

步骤四:配置pm2
1.首先使用pm2 init 命令初始化文件可得到pm2的ecosystem.config.js配置文件,编辑ecosystem.config.js配置文件如下:

//ecosystem.config.js文件中的配置

module.exports = {
  apps: [{
    name: 'cnypa-nuxt',
    script: 'server.js',
    // script: 'cross-env NODE_ENV=production nodemon server/index.js --exec babel-node',
    append_env_to_name: true,

    // exec_interpreter: "babel-node", //此配置就是使用babel-node去执行nodejs文件
    exec_mode: "fork",


    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    out_file: "./logs/out-0.log",
    error_file: "./logs/err-0.log",
    autorestart: true,
    watch: true,
    max_memory_restart: '1G',
    env: {
      COMMON_VARIABLE: 'true'
    },
    env_production: {
      NODE_ENV: 'production'
    },
    env_test: {
      NODE_ENV: 'test'
    }
  }]
};

//package.json中的配置
{
  "name": "cnypa-nuxt",
  "version": "1.0.0",
  "description": "My lovely Nuxt.js project",
  "author": "liwz",
  "private": true,
  "scripts": {
    "dev": "cross-env NODE_ENV=development PORT=3000 nodemon server/index.js --watch server --exec babel-node",
    "build": "nuxt build",
    "start": "cross-env NODE_ENV=production nodemon server/index.js --exec babel-node",
    "prod": "nuxt start && node server/index.js  --exec babel-node",
    "prd": "pm2 deploy ecosystem.config.js production",
    "generate": "nuxt generate",
    "pm2": "pm2 start ecosystem.config.js --interpreter babel-node --env production"
  },


2.然后使用pm2 start ecosystem.config.js,运行node服务。

注:
但是本人测试不加入exec_interpreter:"babel-node"时,pm2能够正常开启,只是会抛不支持import的错误;加入exec_interpreter:"babel-node"后,会直接导致pm2运行错误。
所以贴上自己的解决方式:
就是去掉pm2配置文件的exec_interpreter:"babel-node"配置,在使用pm2 start ecosystem.config.js时加入–interpreter babel-node即:
执行

pm2 start ecosystem.config.js --interpreter babel-node


//或者执行npm run pm2


虽然pm2正常启动,但是输入pm2 logs 0查看进程日志时,发现又会抛出无法识别import的错误。根据分析好像使用pm2结合babel-node启动项目时,并不会自动找到.babelrc文件。

3.解决办法
(1)再创建一个server.js文件
如下:

require('babel-register')
require('babel-polyfill')
require('child_process').exec(`babel-node ./server/index.js`)


//.server/index.js为node.js服务器端的入口文件,目录如下:


注:
需要使用pm2安装babel-polyfill模块,即:

npm install --save babel-polyfill


(2)修改ecosystem.config.js文件
将script改为‘server.js’即:

module.exports = {
  /**
   * Application configuration section
   * http://pm2.keymetrics.io/docs/usage/application-declaration/
   */
  apps : [

    // First application
    {
      name      : 'API',
      script    : 'server.js',
      cwd:"./",
      log_date_format:"YYYY-MM-DD HH:mm:ss",
      out_file:"./logs/out-0.log",
      error_file:"./logs/err-0.log",
      watch:true,
      //exec_interpreter:"babel-node",
      exec_mode:"fork",
      env: {
        COMMON_VARIABLE: 'true'
      },
      env_production : {
        NODE_ENV: 'production'
      }
    },
  ]
};

注:exec_mode必须为foro模式,不能是cluster模式。这里可以看官方文档。https://pm2.keymetrics.io/docs/usage/quick-start/
(3)使用pm2启动项目

pm2 start ecosystem.config.js --interpreter babel-node

或者用package.json中的命令:npm run pm2
这样就可以正常启动es6项目了。

另外:要想看pm2是否启动成功,可以使用pm2 list    查看.看pm2启动日志用命令:pm2 logs

总结
1.直接使用babel-node
使用babel-node去运行es6文件时,并不需要加入server.js文件,即并不需要引入’babel-register’和’babel-polyfill’模块,否则会抛出:

throw new Error("only one instance of babel-polyfill is allowed");
  ^

Error: only one instance of babel-polyfill is allowed
    at Object.<anonymous> (E:\WebStormProject_2\seckill\Bable_Test\node_modules\babel-polyfill\lib\index.js:10:9)
    at Module._compile (module.js:652:30)
    at Module._extensions..js (module.js:663:10)
    at require.extensions.(anonymous function) (E:\nvm\nvm\npm\node_modules\babel-cli\node_modules\babel-register\lib\node.js:152:7)
    at Object.require.extensions.(anonymous function) [as .js] (E:\WebStormProject_2\seckill\Bable_Test\node_modules\babel-register\lib\node.js:152:7)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)


意思是不能创建多个babel-polyfill实例。我们可以认为直接使用babel-node命令执行时,它会创建一个babel-polyfill实例去读取.babelrc文件。
2.使用pm2运行es6项目
除了pm2 start ecosystem.config.js --interpreter babel-node命令以外,需要引入’babel-register’和’babel-polyfill’模块,否则仍然会无法识别import等es6语法。
3.babel-polyfill 作用
因为babel只编译语法,不编译API,所以如果用到一些ES6的API需要引入该babel-polyfill模块。

例如:

Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。

举例来说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。
————————————————

原文链接:https://blog.csdn.net/wushichao0325/article/details/85262063

参考链接:

https://my.oschina.net/u/4041154/blog/3062887

https://juejin.im/post/5b9def74e51d450e6237cbdb

https://pm2.keymetrics.io/docs/tutorials/using-transpilers-with-pm2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值