获取browserify需要路径的行为更像requirejs

时间:2014-02-26 19:45:16

标签: javascript node.js requirejs commonjs browserify

我发现移动文件并不断重写文件包含相对于新文件夹的路径时会感到很痛苦。

我想在浏览器代码中避免这种情况:

var View = require('../../../../base/view');

并根据requirejs做更多事情,知道我的基本路径是js

var View = require('base/view');

3 个答案:

答案 0 :(得分:13)

您应该使用paths选项。它没有记录在browserify中,而是在node-browser-resolve中(在引擎盖下使用):

  

paths - 如果在法线上找不到任何内容,则使用require.paths数组   node_modules递归遍历

答案 1 :(得分:9)

这里一个很好的选择是使用aliasify插件,可用here。然后只需将这样的内容添加到package.json,aliasify配置中的所有路径都相对于该文件的位置:

  "browserify": {
    "transform": [
      "aliasify"
    ]
  },
  "aliasify": {
    "aliases": {
      "app": "./src/app",
      "components": "./src/components",
      "someAlias": "./src/app/some/path/to/a/place",
      "foobar": "./go/to/a/module/named/foobar",
    }
  }

然后,在您的文件中,只需执行:

var foobar = require("foobar");
var sampleComponent = require("components/someSample");

//My JS code

答案 2 :(得分:4)

node_modules

您可以在node_modules下面放置您的应用程序代码(或符号链接,如果您的平台支持它)。 E.g:

node_modules/
+-- app/
    +-- js/
        +-- base/
            +-- view.js
        +-- a/
            +-- b/
                +-- c/
                    +-- somefile.js
// somefile.js                
require("app/js/base/view");

然而,这是一个重要的警告:这会破坏通过API以编程方式指定的转换应用,例如:

browserify('app/entry.js')
  .transform(es6ify)

在浏览器中,有一个" top-level"的概念。与变换一起发挥作用的文件。浏览器文档中很难解释这个概念,以及一般的转换行为。您可以在此处查看有关此问题的一些讨论:substack/node-browserify#993

pathmodify

另一个选项是我的pathmodify browserify插件。这允许使用非相对路径和程序化变换。要启用浏览器代码,例如:

var View = require('base/view');

您可以这样做:

var pathmodify = require('pathmodify');

var opts = {mods: [
  // Maps require() IDs beginning with "base/" to begin with
  // "/somedir/js/base/"
  pathmodify.mod.dir("base", "/somedir/js/base"),
]};

// Give browserify the real path to entry file(s).
// pathmodify will transform paths in require() calls.
browserify('./js/entry')
  .plugin(pathmodify, opts)
  .transform(es6ify)
  .bundle()
  ...

联合

请注意,pathmodify只能解决browserify的问题。如果您需要像base/view这样的路径也可以在其他上下文中工作,比如节点,那么如果您有符号链接可用,则可以将两者结合使用。例如,符号链接node_modules/base/somedir/js/base,并按指示配置pathmodify,并继续将browserify指向node_modules以外的路径以获取条目文件。