nodejs之使用babel支持es6和pm2下使用babel
步驟一:安裝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配置文件如下:
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [
// First application
{
name : 'API',
script : 'app.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",//此配置就是使用babel-node去執行nodejs文件
exec_mode:"fork",
env: {
COMMON_VARIABLE: 'true'
},
env_production : {
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
雖然pm2正常啓動,但是輸入pm2 logs 0查看進程日誌時,發現又會拋出無法識別import的錯誤。根據分析好像使用pm2結合babel-node啓動項目時,並不會自動找到.babelrc文件。
3.解決辦法
(1)再創建一個server.js文件
如下:
require('babel-register');
require('babel-polyfill');
require('./app')
注:
需要使用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'
}
},
]
};
(3)使用pm2啓動項目
pm2 start ecosystem.config.js --interpreter babel-node
這樣就可以正常啓動es6項目了。
總結
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,爲當前環境提供一個墊片。