Javascript 在Browserify和NPM中需要根路径(去掉两个位置)

Javascript 在Browserify和NPM中需要根路径(去掉两个位置),javascript,npm,gulp,browserify,Javascript,Npm,Gulp,Browserify,我已经到处寻找这个问题的解决方案,但到目前为止运气不佳——即使使用和阅读并重新阅读Browserify手册上的条目,我似乎也找不到解决这个问题的有效方法 我有一个用Browserify构建的库,我正试图将它发布到npm,如果您想测试我在这里描述的内容,可以使用它。问题是:我想在调用require()时不使用相对路径将其发布到NPM,这就是我使用Browserify时的工作方式。 请参阅,使用Browserify的opts.path我可以从以下内容更改我的require()s var Classy

我已经到处寻找这个问题的解决方案,但到目前为止运气不佳——即使使用和阅读并重新阅读Browserify手册上的条目,我似乎也找不到解决这个问题的有效方法

我有一个用Browserify构建的库,我正试图将它发布到npm,如果您想测试我在这里描述的内容,可以使用它。问题是:我想在调用
require()
时不使用相对路径将其发布到NPM,这就是我使用Browserify时的工作方式。

请参阅,使用Browserify的
opts.path
我可以从以下内容更改我的
require()
s

var Classy$Base = require('./base')
// and in another file
var Classy$Module = require('../../module')

太棒了!而且效果很好!当我喝下一大包时,我得到了一个工作的
classy.bundle.js
生活很好

因此,在另一个项目中(也使用Browserify),
npm-link-classy-js
,没有任何效果。我从
require('classy-js')
的内部得到错误,比如“无法从'node\u modules/classy js/src…'中找到模块'classy/base'”等等

我希望能够创建一个库,在这里我可以
require('classy-js')
require('classy-js/classy/module')
并访问库中所有其他有用的子模块,而不牺牲库自身代码中的非相对路径

有什么方法可以做到这一点吗?

我尝试过使用,但在使用时会将错误浏览出来,并且我尝试过使用,结果类似

我还尝试了符号链接,并添加了一个npm postInstall脚本来自动生成符号链接,但也没有效果


这似乎真的不难做到…

好吧,这可能是不受欢迎的,我不确定我在npm上看到过这样的软件包,但我认为这会起作用:

//模块的名称。即与“package.json”中的“name”属性值相同。
var Classy$Base=require('Classy-js/Base')
//在另一个文件中
var Classy$Module=require('Classy-js/Module')
回复:本部分:

因此,在另一个项目中(也使用Browserify),
npm-link-classy-js
,没有任何效果


为了配合第一个建议,还要将
npm链接到classy js
(几乎)。假设你有
/somedir/subdir/classy js
。确保有一个
/somedir/subdir/node_modules
,然后导航到
/somedir/subdir
npm link classy js
。确保你没有
/somedir/subdir/classy js/node_modules
npm link
中的
/somedir/subdir/classy js
或者你会有一个循环引用,它会搞砸模块的分辨率。

在我看来,我已经解决了这个问题,尽管答案真的很愚蠢。虽然可能有用,但我没有走那条路

由于这两个项目都在使用Browserify,我只需执行
require('classy-js')
,就可以要求classy进入第二个项目,并且它知道如何在node_模块中查找并找到它。但是,由于Browserify没有使用我构建Classy bundle时使用的
opts.path
,它不知道如何解析像
require('Classy/base')这样的路径。就这样,我们会得到一堆错误

解决方案是一个
npm postinstall
脚本,它创建一个空的node_modules文件夹(Classy没有依赖项,只有devdeependencies),并将
node_modules/Classy
符号链接到
src/Classy
node_modules/self
(src/中的另一个顶级模块)符号链接到
src/self>。这样我们就不会弄乱一个单独项目的
opts.path
,我们更好的
require()
s也会在节点中工作

后安装程序如下所示:

// package.json
...
  "scripts": {
    "test": "gulp test",
    "postinstall": "mkdir node_modules && node create-symlinks.js"
  },
...
create symlinks.js
看起来像

// create-symlinks.js
var fs = require('fs')

var c  = '../src/classy'
  , s  = '../src/selfish'
  , cd = 'node_modules/classy'
  , sd = 'node_modules/selfish'
  , e  = undefined

e = fs.existsSync(cd);
if (!e) {
  console.log('link', cd, 'to', c)
  fs.symlinkSync(c, cd, 'dir')
}

e = fs.existsSync(sd)
if (!e) {
  console.log('link', sd, 'to', s)
  fs.symlinkSync(s, sd, 'dir')
}
它让人感觉很粗糙和错误,但它确实有效,并且使用了与“更好的本地需求”要点中给出的符号链接建议类似的约定。就是这样

就访问Classy中的子模块而言,将任何公共API子模块(如Classy$Module)公开为顶级Classy对象的字段更容易(阅读:可能)。所以,现在就不要做了

var Classy$Module = require('classy-js/module')
或者类似的,只是

var Classy$Module = require('classy-js').Module

它虽然不完全理想,但仍然有效,而且“足够好。”

那么您是
npm链接到您的源代码还是
classy.bundle.js
?如果
classy-js
是一个browserify捆绑包,你会怎么做
require('classy-js/classy/module')
。我已设置了所有导出,这样,如果
require()
s解析正确,它将在NPM中工作。您可以使用上面的链接看到代码,我很困惑——browserify从何而来?我以为你说你要出版图书馆的浏览版。啊。。。Browserify只是让我更容易使用非相对路径。出于这个问题的目的,我只是想用它来说明我希望
require('classy/base')
(browserify构建很容易)在通过NPM使用库时也能工作。哦,好的。您应该更新您的问题——正如目前所写的,它说您想向npm发布一个browserify包。
var Classy$Module = require('classy-js').Module