UP | HOME

NodeJs 支持Es6

Node10现在是最新版本,es6也是可以支持了.

1. 使用mjs文件扩展名

js文件以mjs作为扩展名的话,可以这样来直接执行:

node --experimental-modules xxxx.mjs

这种方式比较麻烦,毕竟每个文件都要以mjs结尾。同时导致很多编辑器对mjs识别有问题。

2. 使用loader

命令格式如下:

NODE_OPTIONS='--experimental-modules --loader ./loader.mjs' node x.js

这样的话,只要定义一个mjs的loader就好了。 官方给的有一个loader的示例,还是好用的。

import path from 'path';
import process from 'process';
import Module from 'module';

const builtins = Module.builtinModules;
const JS_EXTENSIONS = new Set(['.js', '.mjs']);

const baseURL = new URL('file://');
baseURL.pathname = `${process.cwd()}/`;

export function resolve(specifier, parentModuleURL = baseURL, defaultResolve) {
  if (builtins.includes(specifier)) {
    return {
      url: specifier,
      format: 'builtin'
    };
  }
  if (/^\.{0,2}[/]/.test(specifier) !== true && !specifier.startsWith('file:')) {
    // For node_modules support:
    // return defaultResolve(specifier, parentModuleURL);
    throw new Error(
      `imports must begin with '/', './', or '../'; '${specifier}' does not`);
  }
  const resolved = new URL(specifier, parentModuleURL);
  const ext = path.extname(resolved.pathname);
  if (!JS_EXTENSIONS.has(ext)) {
    throw new Error(
      `Cannot load file with non-JavaScript file extension ${ext}.`);
  }
  return {
    url: resolved.href,
    format: 'esm'
  };
}

这样创建了一个loader,暂且命名为: loader.mjs. 为了每次命令不用加这个mjs,可以把NODEOPTIONS设置到环境变量中去。 比如当前我用的fish shell里,可以这样设置:

set NODE_OPTIONS '--experimental-modules  --loader YOUR_PATH/loader.mjs'

bash-shell里面,这样设置:

export NODE_OPTIONS ='--experimental-modules  --loader YOUR_PATH/loader.mjs'

然后再执行es6语法的js文件的时候,就可以直接: node xxx.js了。