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 相关文章推荐
前台js对象在后台转化java对象的问题探讨
Dec 20 Javascript
JavaScript制作简易的微信打飞机
Mar 31 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
Jan 12 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
解决vue2中使用axios http请求出现的问题
Mar 05 Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
Vue使用lodop实现打印小结
Jul 06 Javascript
浅析JavaScript 函数柯里化
Sep 08 Javascript
OpenLayers3实现地图显示功能
Sep 25 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 缩略图实现函数代码
2011/06/23 PHP
如何离线执行php任务
2017/02/21 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
常见python正则用法的简单实例
2016/06/21 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
PyQt5每天必学之布局管理
2018/04/19 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
初中女生自我鉴定
2013/12/19 职场文书
生产厂厂长岗位职责
2013/12/25 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
说明书格式及范文
2014/05/07 职场文书
普通党员整改措施
2014/10/24 职场文书
门面房租房协议书
2014/12/01 职场文书
优秀党员个人总结
2015/02/14 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
在职证明格式样本
2015/06/15 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis