Javascript 在Browserify和NPM中需要根路径(去掉两个位置)
我已经到处寻找这个问题的解决方案,但到目前为止运气不佳——即使使用和阅读并重新阅读Browserify手册上的条目,我似乎也找不到解决这个问题的有效方法 我有一个用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
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