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代码
Mar 10 Javascript
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
js里的prototype使用示例
Nov 19 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
Javascript中this绑定的3种方法与比较
Oct 13 Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
JavaScript ES 模块的使用
Nov 12 Javascript
vue+elementUI实现表格列的显示与隐藏
Apr 13 Vue.js
解决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 删除记录实现代码
2009/03/12 PHP
php开发环境配置记录
2011/01/14 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
学习php分页代码实例
2013/10/24 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
python安装以及IDE的配置教程
2015/04/29 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python中正则表达式的用法总结
2019/02/22 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
中学生期末评语
2014/02/03 职场文书
安全生产承诺书范文
2014/05/22 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
个人工作总结范文2014
2014/11/07 职场文书
2014年化验室工作总结
2014/11/21 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
老兵退伍感言
2015/08/03 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS