1

我正在使用 traceur 在 node.js 下启用 ES6 开发traceur.require.makeDefault。这没有问题。

我使用 Gemfury 作为私有 npm 存储库,这也可以。我正在使用 ES6 创建自己的 npm 包。我遇到的挑战是如何支持同时加载 ES5 和 ES6 模块。典型的traceur.require.makeDefault示例代码块会跳过node_modules路径中包含目录的任何内容。

这是我解决这个问题的方法:

var fs = require('fs');
var path = require('path');
var traceur = require('traceur');

require('traceur-source-maps').install(traceur);

function find_parent_package(filename) {
    var current = path.dirname(filename);
    while (true ) {
        var package_json = current + '/package.json';
        if (fs.existsSync(package_json))
            return require(package_json);
        var last_slash = current.lastIndexOf('/');
        if (last_slash === -1) return null;
        current = current.substring(0, last_slash);
    }
}

traceur.require.makeDefault(function(filename) {
    if (filename.indexOf('package.json') > -1) return false;
    if (filename.indexOf('node_modules') === -1) return true;
    var p = find_parent_package(filename);
    return p && p.es6;
});

还有一个package.json适用于上述代码的 ES6 模块的示例(出于隐私考虑,一些信息已被删除):

{
  "name": "ps-core",
  "version": "0.2.0",
  "private": true,
  "es6": true,
  "dependencies": {
    "basic-auth": "^1.0.0",
    "express": "^4.10.6",
    "express-hal": "0.0.1",
    "express-session": "^1.10.1",
    "traverson": "^0.15.0"
  }
}

给定一个特定的 npm 模块路径,此代码将遍历目录树,直到找到一个package.json文件、读取它并检查es6密钥。如果为 true,则它允许 traceur 处理文件。

我的问题是:鉴于上述实现,有没有更好的方法来做到这一点?

4

0 回答 0