Node中使用ES6语法的基础教程


Posted in Javascript onJanuary 05, 2018

相关背景介绍

我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5。这个版本己经很多年了,且完美被各大浏览器所支持。所以很多学js的朋友可以一直分不清楚es5和javscript的关系。javascript是一门编程语言,那么它就会有版本,es5还是es6 就就是它的版本号。最新版es7己经在紧锣密布的进行中,它最新的语法会让我们写代码更新的行云流水。

引言

Node本身已经支持部分ES6语法,但是import export,以及async await(Node 8 已经支持)等一些语法,我们还是无法使用。为了能使用这些新特性,我们就需要使用babel把ES6转成ES5语法

安装babel

npm install babel-cli -g

<!-- more -->

基础知识

babel的配置文件是.babelrc

{
 "presets": []
}

新建一个demo文件夹,文件夹下新建 1.js

const arr = [1, 2, 3];
arr.map(item => item + 1);

同时新建.babelrc配置文件

{
 "presets": []
}

终端运行

babel 1.js -o dist.js

可以看见,在文件夹下,新建了一个dist.js,这就是babel转码后的文件

但是,dist.js目前是没有任何变化的,因为我们在配置文件里面没有声明转码规则,所以babel无法转码

安装转码插件

npm install --save-dev babel-preset-es2015 babel-preset-stage-0

修改配置文件

{
 "presets": [
 "es2015",
 "stage-0"
 ]
}

es2015可以转码es2015的语法规则,stage-0可以转码ES7语法(比如async await)

再次运行终端

babel 1.js -o dist.js

可以看见,箭头函数被转码了

var arr = [1, 2, 3];
arr.map(function (item) {
 return item + 1;
});

我们试下async await

async function start() {
 const data = await test();
 console.log(data);
}
function test() {
 return new Promise((resolve, reject) => {
 resolve('ok');
 })
}

转码后的文件

'use strict';
var start = function () {
 var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
 var data;
 return regeneratorRuntime.wrap(function _callee$(_context) {
  while (1) {
  switch (_context.prev = _context.next) {
   case 0:
   _context.next = 2;
   return test();

   case 2:
   data = _context.sent;

   console.log(data);

   case 4:
   case 'end':
   return _context.stop();
  }
  }
 }, _callee, this);
 }));
 return function start() {
 return _ref.apply(this, arguments);
 };
}();
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

function test() {
 return new Promise(function (resolve, reject) {
 resolve('ok');
 });
}

再试下 import export

util.js

export default function say() {
 console.log('2333');
}

1.js

import say from './util';
say();

这次,要把1.js和util.js都转码,我们可以把整个文件夹转码

babel demo -d dist

新生成的dist文件夹下,就有转码后的文件。可以看见,转码后,仍然使用的是module.exportsCMD模块加载

babel-preset-env

上面的转码其实有个缺陷,就是babel会默认把所有的代码转成es5,这意味着,即使node支持let关键字,转码后,也会被转成var

我们可以使用babel-preset-env这个插件,它会自动检测当前node版本,只转码node不支持的语法,非常方便

npm install --save-dev babel-preset-env

.babelrc

{
 "presets": [
  ["env", {
  "targets": {
   "node": "current"
  }
  }]
 ]
 }

1.js

class F {
 say() {
  
 }
}
const a = 1;
babel 1.js -o dist.js

编译出来后

"use strict";
class F {
 say() {}
}
const a = 1;

可以看见,class和const并没有被转码,因为当前node版本(8.9.3)支持该语法

在实际项目中使用ES6语法

Koa2需要Node v7.6.0以上的版本来支持async语法,同时,我们也想在Koa2中使用import模块化写法

npm install --save-dev babel-register
npm install koa --save

新建一个文件夹app

util.js

export function getMessage() {
 return new Promise((resolve, reject) => {
  resolve('Hello World!');
 })
}

app.js

import Koa from 'koa';
import { getMessage } from './util'
const app = new Koa();
app.use(async ctx => {
 const data = await getMessage();
 ctx.body = data;
});
app.listen(3000);

如果直接启动文件,肯定会报错

node app

我们需要一个入口文件,来转码

index.js

require("babel-register");
require("./app.js");
node index

访问http://localhost:3000/可以看见页面了!

babel-register是实时转码的,所以实际发布时,应该先把整个app文件夹转码

babel app -d dist

这次,只要启动dist下的app.js即可

node app

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
初窥JQuery(二) 事件机制(1)
Nov 25 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
优化Jquery,提升网页加载速度
Nov 14 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
Nov 30 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
JavaScript数据结构之栈实例用法
Jan 18 Javascript
vue中对象数组去重的实现
Feb 06 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 #Javascript
vue脚手架中配置Sass的方法
Jan 04 #Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 #Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 #Javascript
JS计算输出100元钱买100只鸡问题的解决方法
Jan 04 #Javascript
Angular4学习教程之DOM属性绑定详解
Jan 04 #Javascript
JS实现简易换图时钟功能分析
Jan 04 #Javascript
You might like
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
javascript 闭包详解
2015/07/02 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
数据库专业英语
2012/11/30 面试题
DataList 能否分页,请问如何实现?
2015/05/03 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
写好自荐信的要点
2013/11/06 职场文书
电子技术专业中专生的自我评价
2013/12/17 职场文书
办公室主任先进事迹
2014/01/18 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
关于运动会的口号
2014/06/07 职场文书
体育运动口号
2014/06/09 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android