2013-11-05 48 views
5

什麼是最好的方法是包括像jQuery或Knockout的公共庫擴展名爲Browserify正確的方式來需要擴展與browserify

例如,對於類似knockout-switch-case的項目,全局變量ko(敲除)不會傳遞給模塊定義調用。

敲除的switch-case的AMD代碼是:

(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
     // AMD. Register as an anonymous module. 
     define(['knockout'], factory); 
    } else { 
     // Browser globals 
     factory(root.ko); 
    } 
}(this, function(ko) { 

在那裏它應該ko(敲除)是上root一個全球性的,這將通常是window但使用Browserify當它是Object {}

我曾嘗試使用browserify-shim與像這樣的例子,但預計它沒有工作(雖然它沒有爲knockout-mapping工作,具有較好的模塊舞):

knockout: 
    path: VENDOR_PATH + '/knockout.js' 
    exports: 'ko' 
    depends: 
     jquery: '$' 

我覺得好像我必須忽略一些必須非常明顯的東西,因爲我預計這將是一個相當常見的模塊定義模式,用於包含任何jQuery,Knockout或任何其他依賴於全局的庫的擴展。或者也許這是一個相當具體的問題敲除開關案例正在做。

無論如何,想法和意見真誠讚賞。

+0

您需要勻場淘汰賽' - 開關case'而不是KO本身,以便嘗試類似這樣的方式:'shim(browserify(),{'{{'{}} {''敲除開關案例':{ path:'./js/vendor/knockout-switch-case.js' ,exports:null ,取決於: {knockout:'ko'} } })' – nemesv

回答

5

這browserify-墊片配置爲我工作:

shim(browserify(), { 
    jquery: { 
     path: './js/vendor/jquery.js', 
     exports: '$' 
    }, 
    'knockout': { 
     path: './js/vendor/knockout.js', 
     exports: 'ko', 
     depends: { 
      jquery: '$' 
     } 
    }, 
    'knockout-switch-case': { 
     path: './js/vendor/knockout-switch-case.js', 
     exports: null, 
     depends: { 
      knockout: 'ko' 
     } 
    } 
}) 

有了這一點,你可能需要像往常一樣:var ko = require('knockout');