Node.js 与NodeJ一起使用时,生成的coffee sourcemaps的路径不正确
我正在用Node.js 与NodeJ一起使用时,生成的coffee sourcemaps的路径不正确,node.js,coffeescript,gruntjs,source-maps,Node.js,Coffeescript,Gruntjs,Source Maps,我正在用coffeescript做一些工作。coffeescript通过grunt编译成js,并与一个简单的nodejsexpress应用程序一起使用 我的文件夹结构确实遵循公共文件夹的结构,其中有一个资产文件夹,用于存放要编译的内容(coffeescript,stylus),还有一个公用文件夹,用于存放已编译的内容(js,css): 我的coffee在grunt中的设置是: coffee: client: options: sourceMap: true #
coffeescript
做一些工作。coffeescript
通过grunt
编译成js
,并与一个简单的nodejs
express应用程序一起使用
我的文件夹结构确实遵循公共文件夹的结构,其中有一个资产
文件夹,用于存放要编译的内容(coffeescript
,stylus
),还有一个公用文件夹,用于存放已编译的内容(js
,css
):
我的coffee
在grunt
中的设置是:
coffee:
client:
options:
sourceMap: true
#sourceRoot: '??'
files: [
expand: true
cwd: 'assets/coffee/'
src: ['**/*.coffee']
dest: 'public/js/'
ext: '.js'
]
为了从assets目录中提供文件,我在我的express应用程序中将此目录添加为静态目录:
app.use express.static(process.cwd() + '/assets')
Chrome可以正确识别源地图,但咖啡文件的位置是错误的。例如,url看起来像http://localhost:3000/assets/coffee/main.coffee
。当然,这会导致404,因为资产
是所有咖啡
文件的根目录,并由我的express应用程序提供服务
因此,我需要调整sourceRoot
变量
- 如果我将
设置为sourceRoot
,Chrome会生成指向sourceRoot:'/assets/'
http://localhost:3000/assets/main.coffee
- 如果我将其设置为
则链接为sourceRoot:'/coffee/'
。这适用于http://localhost:3000/coffee/main.coffee
中的文件。未找到资产/coffee/
子目录中的文件,如assets/coffee/
(生成的链接为assets/coffee/lib/
)http://localhost:3000/coffee/util.coffee
sourceRoot
选项似乎会删除文件夹结构
长问题短:sourceRoot
的正确设置是什么?如何保留文件夹结构
我将此问题作为可能的错误报告提交:这似乎实际上是CoffeeScript Grunt任务中的一个错误 见: 在这里,如果options对象有一个“sourceRoot”元素,它将覆盖由该函数创建的生成的sourceRoot:
var createOptionsForFile=函数(文件、路径){
返回{
代码:grunt.file.read(文件),
sourceFiles:[path.basename(文件)],
sourceRoot:appendTrailingSlash(path.relative(path.destDir,path.dirname(文件)))
};
};
它使用从目标目录到源文件所在位置的相对路径(如果您将/js映射到/public/js,这可能会起作用,但对于您来说,路径中将有一个额外的../)
对于您的情况,如果您修改了代码,以便将options=\uu.extend({…
代码替换为以下内容,则可能会起作用:
var newRoot=未定义
如果(options.sourceRoot)newRoot=appendTrailingSlash(path.join(options.sourceRoot,path.dirname(文件));
选项=\扩展({
generatedFile:path.basename(path.dest),
sourceRoot:mapOptions.sourceRoot,
sourceFiles:mapOptions.sourceFiles
},选项);
if(newRoot)options.sourceRoot=newRoot;
我认为这会起作用,因为file
应该与cwd
设置相关
如果对Grunt任务的更改有效,那么制作一个更干净的版本并提交一个pull请求是值得的,因为我认为如果.coffee文件位于目录树中,那么应该在sourcemaps的sourceRoot属性中反映出来
app.use express.static(process.cwd() + '/assets')
options = _.extend({
generatedFile: path.basename(paths.dest),
sourceRoot: mapOptions.sourceRoot,
sourceFiles: mapOptions.sourceFiles
}, options);