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 相关文章推荐
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
JS版元素周期表实现方法
Aug 05 Javascript
在 Express 中使用模板引擎
Dec 10 Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
解决bootstrap-select 动态加载数据不显示的问题
Aug 10 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
Aug 27 Javascript
详解react阻止无效重渲染的多种方式
Dec 11 Javascript
JS实现给数组对象排序的方法分析
Jun 24 Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 Javascript
微信小程序文章列表功能完整实例
Jun 03 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
Nov 16 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
CI框架中cookie的操作方法分析
2014/12/12 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
Python实现的最近最少使用算法
2015/07/10 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
如何在pycharm中安装第三方包
2020/10/27 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
python 用struct模块解决黏包问题
2020/11/07 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
上班打牌检讨书
2014/02/07 职场文书
网管求职信
2014/03/03 职场文书
电视节目策划方案
2014/05/16 职场文书
个人查摆剖析材料
2014/10/16 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
学术会议通知范文
2015/04/15 职场文书
接收函
2019/04/22 职场文书
JS ES6异步解决方案
2021/04/29 Javascript