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 Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
分页栏的web标准实现
Nov 01 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
innerHTML在IE中报错解决方案
Dec 15 Javascript
分享10个原生JavaScript技巧
Apr 20 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
Jan 16 Javascript
layui表格内容溢出的解决方法
Sep 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中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
Python如何实现文本转语音
2016/08/08 Python
Python pass详细介绍及实例代码
2016/11/24 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
学习python可以干什么
2019/02/26 Python
python使用minimax算法实现五子棋
2019/07/29 Python
详解Python中的分支和循环结构
2020/02/11 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
骨干教师申报材料
2014/12/17 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
加薪通知
2015/04/25 职场文书
长征观后感
2015/06/09 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
python字典的元素访问实例详解
2021/07/21 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL