2016-04-22 38 views
2

我已經在我的package.json文件如下:Browserify墊片似乎沒有繫繩連接到窗口對象

"browserify": { 
    "transform": [ 
    "browserify-shim" 
    ] 
}, 
"browser": { 
    "jquery": "./node_modules/jquery/dist/jquery.js", 
    "tether": "./node_modules/tether/dist/tether.js" 
}, 
"browserify-shim": { 
    "jquery": "$", 
    "tether": "Tether" 
} 

然後這個在我的JS模塊之一:

const $ = require('jquery'); 
const Tether = require('tether'); 

然後我得到以下錯誤在瀏覽器中:

tether.min.js:1 Uncaught TypeError: Cannot set property 'Tether' of undefined

但是,如果我不嘗試墊片繫繩,只需使用window.Tether在需要它的模塊,它工作正常。

const $ = require('jquery'); 
window.Tether = require('tether'); 

有沒有人知道爲什麼browserify-shim不適用於Tether這種方式?

+0

順便說一句,你不需要爲這兩個文件中的任何一個使用'browser'指令,因爲路徑是由它們各自的'package.json'文件中的'main'指令設置的。 – YPCrumble

+0

是的,我知道我可以直接從node_modules(通過他們自己的包文件,如你所說)來要求他們。我之所以使用這個墊片是因爲我認爲這讓他們看到了全球的「窗口」。 – davidpauljunior

+1

'browser'指令僅用於提供別名來覆蓋Browserify使用的文件,請參閱https://github.com/substack/node-browserify#browser-field,這是Browserify內核的一部分。我認爲如果你希望在全球範圍內爲你的其他應用程序提供'Tether',你使用'window.Tether'的方法是正確的。另一種選擇是通過CDN拉動Tether,如果可用,並使用['global'](https://github.com/thlorenz/browserify-shim#a-expose-global-variables-via-global)設置從現有的「窗口」而不是重新將代碼合併到你的包中。 – YPCrumble

回答

2

你是對的 - 你需要從你的包中手動指定window對象。

我不是100%肯定,但我的理解是,this part of the documentation,當它說

x exports window.$

實際上意味着$可爲$捆綁中的所有模塊- 這並不意味着您的web應用程序的window對象。

參見例如this issue

問題出在文檔那一部分,看來人們認爲這個對象應該是window的一部分 - 可能是一個好主意來改變它的措辭。

+0

我發現文檔真的不能說清楚它們是什麼意思的'窗口'。這似乎是造成所有問題的原因。我想我希望從模塊中得到我的要求,不要表明它們已經連接到窗口。這可能可以在某個配置中完成。謝謝! – davidpauljunior

+0

是的 - 只是增加了一個[問題](https://github.com/thlorenz/browserify-shim/issues/210)將改善該部分的文檔。 – YPCrumble