本文介绍在Node.js终端中直接运行包含ES6语法的JavaScript文件时,因模块系统差异导致的语法报错问题。通过安装Babel及相关预设插件,将ES6代码转换为Node.js支持的CommonJS格式,从而实现在终端中顺利执行ES6代码。
近期编写简易测试代码时,尝试直接在Node终端中执行,发现部分ES6语法无法被识别。本文记录解决该问题的具体方法。
问题现象
问题现象
首先创建一个名为class.js的文件,并在其中编写如下代码:
// constructer
class Person {
constructor(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
getInfo() {
return `name:${this.name},age:${this.age},sex:${this.sex}`;
}
}
var jone = new Person('jone', 18, 'man');
console.log(jone.name);
export default Person;
随后在终端中运行该脚本,系统会返回如下错误提示:

错误原因是Node.js环境默认采用CommonJS规范进行模块导入与导出,其关键字为require和exports,而非ES6的export。其他常见模块规范还包括AMD规范的requirejs以及CMD规范的seajs。
检查ES6语法支持情况
检查ES6语法支持情况
为了了解当前Node环境对ES6语法的支持程度,可以通过执行node -v命令查看版本号。例如,本地环境版本为10.16.2。

接下来,需要全局安装一个npm包以辅助检查。
npm install -g es-checker
安装完成后,执行es-checker命令即可查看Node对ES6特性的支持率及详细信息。
执行结果如下所示:

在输出信息的末尾部分显示:

这表明当前版本不支持模块方法(modules)。
使用Babel进行转换
使用Babel进行转换
解决方法是引入Babel工具,将代码转换为Node.js支持的语法格式。
在项目根目录(即与package.json文件同级的位置)执行以下安装命令:
npm install --save-dev babel-cli babel-preset-es2015 babel-preset-es2017
其中,babel-cli允许在终端中直接使用babel命令,类似于webpack-cli的作用;babel-preset-*则是Babel转换代码所依赖的前置规则插件集合。安装完毕后,需在同目录下配置Babel,新建.babelrc文件并写入如下配置:
npm install --save-dev babel-cli babel-preset-es2015 babel-preset-es2017
在presets字段中添加转换规则,只需填写babel-preset-*中对应的关键字缩写即可。plugins字段可用于配置定义转换规则的插件。配置完成后,即可在终端中利用Babel对代码进行转换。直接执行babel class.js命令,可以看到代码已被转换为ES2015版本,具体转换结果如下:
PS D:\git\study\mytest> babel src/Object/class.js
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// constructer
var Person = function () {
function Person(name, age, sex) {
_classCallCheck(this, Person);
this.name = name;
this.age = age;
this.sex = sex;
}
_createClass(Person, [{
key: 'getInfo',
value: function getInfo() {
return 'name:' + this.name + ',age:' + this.age + ',sex:' + this.sex;
}
}]);
return Person;
}();
var jone = new Person('jone', 18, 'man');
console.log(jone.name);
exports.default = Person;
若希望直接在终端中执行转换后的代码,可使用如下命令:babel-node xxxx,其中xxxx代表具体的目录及文件名。

通过上述步骤,即可在终端中运行大部分ES6代码。此外,在学习新语法时,也可借助Babel将代码转换为旧版语法,从而帮助理解其底层原理。
至此,关于解决Node终端下运行JS文件不支持ES6语法的内容介绍完毕。如需了解更多相关信息,可搜索本站往期文章或继续浏览后续内容,感谢大家的支持!