簡體   English   中英

Javascript模塊模式和Google Closure編譯器

[英]Javascript Module Pattern and Google Closure Compiler

我現在在Drupal項目上使用Google Closure編譯器 我的Javascript使用Javascript Module Pattern構建。

由於Drupal的工作方式,我將分別編譯每個JS文件。 簡單編譯模式效果很好,但是我想在每個文件上使用高級編譯

我的文件都是關於

var FOO = (function(me, $, Drupal, undefined) {
  function init (context, settings) {
    do_sutff();
  };

  Drupal.behaviors['FOO'] = {
    attach: init
  };

  return me;
}(FOO || {}, jQuery, Drupal));

我的問題是Drupal.behaviors是Drupal中的特定對象,而attach屬性也是特定屬性。 當呈現Drupal頁面時, Drupal.behaviors會循環瀏覽,並且所有attach函數都將使用適當的參數進行調用。 換句話說,我不希望使用Drupal對象重命名任何東西

當我使用高級編譯模式時,

var c = function(a, d, b) {
  b.b.FOO = {a:function() {
    do_stuff()
  }};
  return a
}(c || {}, jQuery, Drupal);

我嘗試過多種變體,試圖使編譯器將整個Drupal對象識別為沒有運氣的外部對象。 無論我如何嘗試, .behaviors.attach始終會被重命名。

有沒有辦法告訴編譯器不要讓整個對象動手?

沒有概念“不要修改該對象的任何屬性”。 但是,您可以設置一個外部變量,例如:

/** @interface */
function DrupalBehavior() {}
DrupalBehavior.prototype.attach = function(){};

/** @constructor */
function DrupalObject () {}

/** @type {Object.<string, DrupalBehavior>} */    
DrupalObject.prototype.behaviors = {};

然后,在您的代碼中:

var FOO = (
   /**
    * @param {Object} me
    * @param {jQuery} $
    * @param {DrupalObject} Drupal
    * @param {*=} undefined
    */
   function(me, $, Drupal, undefined) {
     function init (context, settings) {
       do_sutff();
     };
     Drupal.behaviors['FOO'] = {
       attach: init
     };

     return me;
  }(FOO || {}, jQuery, Drupal));

在這種情況下,Drupal參數將被重命名,但是behaviors屬性及其關聯的attach子屬性將不會重命名。

關於jQuery的注意事項:您正在將jQuery名稱空間對象作為參數傳遞給函數。 Closure-compiler在此對象中不能很好地跟蹤類型。 我列出的注釋是針對jQuery對象的實例,而不是整個jQuery名稱空間。 這可能不是您想要的。 在Closure-compiler中處理此問題的唯一類型安全方法是不通過函數閉包傳遞名稱空間。

更新:在瀏覽了鏈接的JavaScript模塊模式后,他們鼓勵將全局名稱空間對象傳遞到函數閉包中。 此模式在Closure-compiler中存在已知問題。 您將需要選擇遵循這方面的模式,或者選擇與ADVANCED_OPTIMIZATIONS完全兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM