如何在包里 获取引用用这个包的文件的 路径?


比如这里有个npm package test 它的主函数是 lib/index.js


 exports.say = ->
    console.log("依赖引用我的文件是??")
    //怎么获取? process.cwd()肯定是不行的, 因为引用这个包的文件不一定是 入口函数。

这里有个demo.coffee, 引用了 test包,并且调用了它的say 方法


 test = require 'test'

test.say()

在say函数里面是否可以获取的到demo.coffee的文件路径? 则个demo.coffee不是入口函数

node.js

高町フェイト 11 years, 2 months ago

 #获取基于当前引用路径的完整路径 ?如何实现?
exports.getFilePathBaseOnRequire = (path)->
  if module.parent
    requireParentDirctor = _path.dirname module.parent.filename
    return getFilePath(path, requireParentDirctor)

ybtp1 answered 11 years, 2 months ago

你这种很明显用OO写比较好,因为test可能会被无数个模块依赖,要输出对应不同的信息,就需要保存这些信息,然后把消息传递到lib/index.js里。
lib/index.js该写成这样(为了省事我写成ES6的class,iojs1.04可以用 node --harmony-classes app.js来启动 )


 javascript


 "use strict";
class Test{
    constructor(dir){
        this.dir=dir;
    }
    say(){
        console.log(this.dir);
    }
}
module.exports=function(dir){
    return new Test(dir);
};

然后使用的时候就可以写了


 javascript


 //demo.js
var test = require("test")(__filename);
test.say();


 javascript


 //入口app.js
require("./demo.js");

这样做的好处是你在编写lib/index.js文件的时候,任何方法都可以用到this.dir这个变量,而这个变量是通过实例化来保证每个文件都不同的。

而且,在你模块开始的时候就调用一次var test = require("test")(__filename);之后,由于node.js会把模块自动缓存下来,所以你不用担心单个文件会多次实例化Test。

在这之后你就可以随意调用test的各种方法了。

newneos answered 11 years, 2 months ago

Your Answer