Browserify基于目录的选项(类似于RequireJS)

12

我无法理解 browserify basedir 选项 的工作原理。

注意:由于我从 RequireJS(类似于 baseUrl)来,因此我对整个 basedir 概念的理解可能是错误的。

编辑 事实上我确实错了,但你仍然可以通过使用 paths 选项来实现我尝试做的事情,详见下文。

我理解 basedir 选项给了你自由的能力去指定所有需要的路径(以 . 开头)从一个静态的根/基础目录开始。而不是从 process.cwd() 开始。

这真的让我发疯了,我认为这样的功能应该非常基础且容易实现,并且很多人都会遇到与我相同的问题,但实际上关于如何正确设置 basedir 选项的信息非常少。相信我,这并不是直接明显的。

以下是让我困扰的基本示例。

假设有以下文件结构:

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 只影响传递给 browserify 以启动打包过程的路径(在您的情况下是 app.js 的路径)。在 require() 中使用的路径仍将相对于它们所在的文件。 - Ben
是的,谢谢,这就是我最终理解的。browser-resolvepaths 选项正是我在寻找的。 - eightyfive
1个回答

10

原来 basedir 和 RequireJS 的 baseUrl 不同。正如评论中@Ben所说的那样,官方文档如下:

opts.basedir 是 browserify 开始捆绑的目录,用于以.开头的文件名。

(来源)

这意味着 basedir 仅适用于 entry 文件。在文件树结构中深入的其他 require 调用将始终相对于当前正在解析的文件进行解析。

我的问题的答案

browser-resolvepaths 选项(由 browserify 在后台使用)是我要找的内容:

路径-如果在正常的 node_modules 递归行走中没有找到任何内容,则使用 require.paths 数组

(来源)

在实例化打包程序时,只需将此选项与其他browserify选项一起传递即可。

注意:似乎在与browserify-shim转换器一起使用时会出现问题


你可能会对这个话题感兴趣:https://dev59.com/kmIj5IYBdhLWcg3wilgI#23608416 - Sebastien Lorber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接