Node.js 组织需求并将其移动到文档顶部

Node.js 组织需求并将其移动到文档顶部,node.js,abstract-syntax-tree,jscodeshift,Node.js,Abstract Syntax Tree,Jscodeshift,我正在应用程序中组织代码。require语句是无组织的,所以我制作了这个codemod来对它们进行排序,并将它们添加到页面顶部 ,几乎完美。我有一些疑问: 这是一种可行的方法,还是有一种更正确的方法来使用API 如何在sourceStart(所有要求)和其余源代码之间保留空行 ES6导入是否可以使用类似的方法?(即使用jscodeshift对其进行排序) 我的初始代码: var path=require('path'); var stylus=需要('stylus'); var expres

我正在应用程序中组织代码。require语句是无组织的,所以我制作了这个codemod来对它们进行排序,并将它们添加到页面顶部

,几乎完美。我有一些疑问:

  • 这是一种可行的方法,还是有一种更正确的方法来使用API
  • 如何在
    sourceStart
    (所有要求)和其余源代码之间保留空行
  • ES6导入是否可以使用类似的方法?(即使用jscodeshift对其进行排序)
我的初始代码:

var path=require('path');
var stylus=需要('stylus');
var express=需要(“express”);
var router=express.router();
var async=require('async');
让restOfCode='foo';
我的代码模块:

let requires=j(file.source).find(j.CallExpression{
“被叫人”:{
“名称”:“要求”
}
}).最近(j.变量声明器);
让sortedNames=requires.\uu path.map(node=>node.node.id.name).排序(sort);//[“异步”、“快速”、“路径”、“手写笔”]
让sortedRequires=[];
requires.forEach(r=>{
let index=sortedNames.indexOf(r.node.id.name);
sortedRequires[index]=j(r).最近的(j.VariableDeclaration)。u路径[0];//{
//不返回任何内容,它将被替换到文档顶部
})
.toSource();
return sourceStart.concat(sourceRest).join('\n');//有比[].concat(string.join)更好的方法吗?
我得到的结果是:

var async=require('async');
var express=需要(“express”);
var path=require('path');
var stylus=需要('stylus');
var router=express.router();//
这是一种可行的方法,还是有一种更正确的方法来使用API

您不应该直接访问
\u路径
。如果需要访问所有节点路径,可以使用
.paths()
方法。如果要访问AST节点,请使用
.nodes()

例如,映射将只是

let sortedNames = requires.nodes()(node => node.id.name).sort(sort);
如何在
sourceStart
(所有要求)和其余源代码之间保留空行

这并不是一个很好的方法。请看。希望有一天CST会让这变得更容易

ES6导入中是否可以使用类似的方法?(即使用jscodeshift对其进行排序)

当然可以


FWIW,这是我的版本(基于您的第一个版本):

export default function transformer(file, api) {
    const j = api.jscodeshift;
    const sort = (a, b) => a.declarations[0].id.name.localeCompare(
        b.declarations[0].id.name
    );

    const root = j(file.source);
    const requires = root
      .find(j.CallExpression, {"callee": {"name": "require"}})
      .closest(j.VariableDeclaration);
    const sortedRequires = requires.nodes().sort(sort);

    requires.remove();

    return root
      .find(j.Statement)
      .at(0)
      .insertBefore(sortedRequires)
      .toSource();
    };
}