2015-03-25 40 views
0

我正在使用一些用於許多Web應用程序的庫。庫本身不使用RequireJS - 它是用節點編寫的,然後與browserify捆綁在一起 - 然而,它的一些依賴者正在使用RequireJS填充來包含庫。庫的依賴項中的匿名define()模塊導致庫的依賴項損壞

我們發現,如果我們的庫依賴於包含匿名定義模塊的庫,如我們的依賴項使用的RequireJS填充符打破了「不匹配的匿名define()」錯誤lodash來源:

// Define as an anonymous module so, through path mapping, it can be 
// referenced as the "underscore" module. 
define(function() { 
    return _; 
}); 

我在這個問題上找到了RequireJS documentation;但是它的所有解決方案似乎都假設用匿名模塊導入庫的庫正在使用RequireJS,但這裏並不是這種情況。

我該如何處理這個問題,以便下游庫不需要做任何特殊處理以便要求我們的庫?理想情況下,如果我們不需要爲每個使用匿名模塊定義的庫添加自定義邏輯,那就好了。

回答

1

您可以嘗試使用Browserify standalone選項和derequire捆綁您的應用程序。

也許您在lodash上使用derequire,然後使用standalone選項捆綁您的應用程序。

以下是從Browserify documentation

opts.standalone是一個非空字符串,一個獨立的模塊是與該名稱和 umd包裝創建 。您可以在獨立的全局導出中使用 名稱空間,並使用字符串 中的.作爲分隔符。例如:'A.B.C'

注意,在獨立模式從原來的 源require()電話仍然將圍繞,這可能絆倒AMD裝載機require()調用掃描 。你可以用 derequire刪除這些電話:

$ npm install -g derequire $ browserify main.js --standalone Foo | derequire > bundle.js

opts.insertGlobalVars將被傳遞到 insert-module-globals 作爲opts.vars參數。

opts.externalRequireName默認爲'require'expose模式 但您可以使用其他名稱。

請注意,如果文件不包含javascript源代碼,那麼您還需要爲它們指定相應的轉換。

所有其他選項一起 直接module-depsbrowser-pack轉發。

您還可以找到在http://www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

+0

雖然我沒有測試過,但我將其標記爲「最佳答案」。我找到了一個我剛剛發佈的替代解決方案; (儘管很醜陋),除非我們發現目前的解決方案存在問題,否則無需研究其他解決方案。但是我會假設這是更正確的方法,除非我另有說明。 – Retsam 2015-04-29 00:44:33

0

所以我落得這樣做導入requirejs優化到browserify項目,並正在運行的所有,包括匿名定義模塊文件的有關獨立選項一個很好的教程通過requirejs優化器,在捆綁它們之前,通過browerify transform函數。

的代碼看起來是這樣的:

//Kept an explicit list of things to requirejs optimize, to avoid running every file through the optimizer 
var modulesToRequireJSOptimize = ["lodash"]; 
var lib = browserify(); 
//... 
lib.transform(requireJSOptimize, {global: true}); //global true to apply it to the modules 

function requireJSOptimize(file) { 
    var moduleName; 
    //Determine if the file is one of the modules we need to optimize 
    modulesToRequireJSOptimize.forEach(function(mod) { 
     if(require.resolve(mod) === file) { 
      moduleName = mod; 
     } 
    } 
    if(!moduleName) { 
     return through(); //do nothing 
    } 
    var end = function() { 
     var pipe = this; 
     var optimizerConfig = { 
      name: moduleName 
      optimize: "none" //don't minify 
      paths: {} 
      out: function(optimizedJS) { 
       this.queue(optimizedJS); 
       this.queue(null); 
      } 
     } 
     //strip off .js 
     optimizerConfig.paths[moduleName] = file.substr(0, file.length-3) 
     requirejs.optimize(optimizerConfig, 
      function() {}, //success handled in optimizerConfig.out 
      function(err) {} //handle err here 
     ); 
    }; 
    return through(function() {}, end); 
} 

它不漂亮,但它的工作對我們的目的。我建議其他人首先嚐試OweR ReLoaDeD的獨立+必需品,但我認爲我會爲了完整而分享我最終的解決方案。

相關問題