Browserify basedir选项(类似requirejs)



我不能弄清楚browserify basedir选项是如何工作的。

注意:我对整个basedir概念的理解可能是错误的,因为我来自RequireJS(想想baseUrl)。

编辑确实我错了,但是你仍然可以实现我试图用paths选项做的事情,见下面我的答案。

我知道basedir选项给了你能力(自由!)从一个静态根/基目录指定所有需要的路径(从.开始)。And NOT from process.cwd() ..

这简直让我疯了,我认为这样的功能将是如此基本的实现,很多人会遇到和我一样的问题,但实际上网上很少有关于如何正确设置basedir选项的信息。相信我,这不是直截了当的…

这就是让我抓狂的BASIC示例。

给定以下文件结构:

js/
js/app.js
js/src/models/Person.js
js/src/views/PersonView.js

并运行:

var browserify = require('browserify');
var gulp = require('gulp');
gulp.task('scripts', function() {
  var b = browserify('./app', {basedir: './js'});
  b.bundle().pipe(gulp.dest('./dist'));
});

我希望能够在PersonView.js中执行以下require()调用:

var Person = require('./src/models/Person');
...

而不是(这显然是工作…):

var Person = require('../models/Person');
...

但是我得到以下错误:

Error: module "./src/models/Person" not found from "/Users/...some path.../js/src/views/PersonView.js"

我错过了什么关于basedir选项?

原来basedir和RequireJS的baseUrl是不一样的。正如@Ben在上面的评论中所说,官方文档说:

opts.basedir是browserify 开始绑定的目录from查找以.开头的文件名。

(源)

表示basedir只适用于entry文件。进一步深入到文件树结构中的require调用将总是相对于当前正在解析的文件进行解析。

回答我的问题

browser-resolvepaths选项(由browserify在引擎盖下使用)是我正在寻找的:

paths - require。如果在normal上没有找到任何内容,则使用的路径数组Node_modules递归walk

(源)

在实例化绑定器时,只需将此选项与其他browserify选项一起传递。

注意:当与browserify-shim transform一起使用时,它看起来会把事情搞砸。

最新更新