Node.js 组织需求并将其移动到文档顶部
我正在应用程序中组织代码。require语句是无组织的,所以我制作了这个codemod来对它们进行排序,并将它们添加到页面顶部 ,几乎完美。我有一些疑问: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
- 这是一种可行的方法,还是有一种更正确的方法来使用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();
};
}