前言
前面,我們以乙個實戰案例來詳細說明了如何在實際開發中使用jsduck工具。但是,並不是所有的時候,**的封裝方式都受我們控制的。例如,如果我們使用了現在的幾個主流框架angularjs、react或者vue的時候,**的封裝方式就必須按照框架定義的方式來構建。當我們的****現了模組、控制器、服務、指令等jsduck完全不認識的組成部分時,我們該如何使用jsduck來正確描述我們的**呢?
那麼,下面,筆者就以 angularjs 為例,來說一說筆者自己的解決方案。
融合思路
解決這個問題,有兩種思路。第一種,可以將jsduck不識別的**部分對映到工具識別的標籤來進行描述。第二種,既然沒有現成的標籤來描述這些新成員,那我們可以自定義一套標籤來描述它們。
第一種方法更方便,不需要額外編碼;第二種方法更優雅,但是需要自定義一整套標籤。
這裡,由於筆者對文件的要求主要是實用,不需要那麼完美,而且現在也沒有過多的精力來研發一整套標籤。所以,筆者選擇了第一種解決方案。
第一種方案最核心的地方就是需要確定angularjs框架給我們的**帶來了哪些新成員,而後如何將這些新成員對映到原有的標籤中去。
angularjs給我們帶來了以下新成員:模組、服務、指令、篩選器和控制器。然後對映關係如下:
新成員對映的jsduck標籤
模組模組類(@class)
服務服務類(@class)
指令模組類中的函式(@method)
篩選器模組類中的函式(@method)
控制器控制器類(@class)
其中,模組是乙個特殊的類,我叫它模組類,它和其他的類是通過命名空間和類名來區分的。例如,ngmodule.layout ,就是我的乙個模組類,ngmodule 這個命名空間就是專門存放模組類的命名空間。
服務是另一種特殊的類,我叫它服務類,服務類和模組類是通過命名空間來關聯的,並且服務類的名稱比較特殊,統一以 「$」 符號開頭。例如 , ngmodule.layout.$layouttag 就是我的乙個服務類,它的命名空間就是它所屬的模組類。
指令和篩選器就比較簡單了,他們都是所屬模組類中的函式。
控制器也是乙個特殊的類,我叫他控制器類,它的命名空間是它所屬模組類。與其他類是通過類的名稱區分的,名稱統一以」ctrl「結尾。例如:ngmodule.frame3.framectrl 就是我的乙個控制器類。這裡,父子控制器就直接通過父類子類來表示。
整體的思路就是如此,那麼,下面咱還是直接上**來說話吧!示例
如下所示,就是我們的乙個模組類的部分**(為了方便檢視,只留下了注釋,刪掉了具體實現):
/****上看已經很清晰了,這段**包含了模組以及模組中服務和指令的注釋方式。篩選器同指令,就不做贅述了。* 頁面通用小控制項模組
* @class ngmodule.layout
* @alias gm.ngcustom.layout
* @author lsjcoder
*/ angular.module("gm.ngcustom.layout",).provider("$layouttag",
/*** 表示查詢項的標籤的服務
* @class ngmodule.layout.$layouttag
* @alias $layouttag
* @author lsjcoder
*/ function() ;
/**
* @member ngmodule.layout.$layouttag
* @method getcheckedtags 獲取選中的標籤
* @param tags 標籤集合
* @returns 選中的標籤集合
*/ $layout.getcheckedtags = function(tags);
/**
* @member ngmodule.layout.$layouttag
* @method clearcheck 清空選擇
* @param tags 標籤集合
*/ $layout.clearcheck = function(tags);
return $layout;
} return factory;
}];}).directive("gmtags",["$layouttag",
/*** @member ngmodule.layout
* @method gmtags 標籤指令,eac模式
* @param [max-tag-num] dom屬性傳值,外部顯示出來的標籤最大個數,缺省會自動根據頁面寬度計算
* @param [multi = true] dom屬性傳值,是否開啟多選模式
* @param tagdata 作用於傳值,指令配置項
* @param tagdata.checktag 選中標籤後呼叫函式的名稱
* @param tagdata.tags 標籤資料
*/ function($layouttag),
link: function (scope, element, attr, transclution)
} }]).directive("datechoose",
/*** @member ngmodule.layout
* @method datechoose 日期指令,eac模式
*/ function()
} }).directive("timechoose",
/*** @member ngmodule.layout
* @method timechoose 時間指令,eac模式
*/ function()
} });
下面,我們再看看控制器的注釋方式:
/**如上**所示,我宣告了乙個控制器 ngmodule.frame3.framectrl ,它屬於模組 ngmodule.frame3 ,父控制器是 ngmodule.frame.framectrl ,內部有乙個函式成員 refreshpage 。* @class ngmodule.frame3 frame3模組
* @alias frame3
* @author lsjcoder
*//**
* @class ngmodule.frame3.framectrl 框架控制器
* @extends ngmodule.frame.framectrl
* @author lsjcoder
*/ /**
* @member ngmodule.frame3.framectrl
* @method refreshpage 重新整理路由頁面
* @param strpath 路由位址
* @author lsjcoder
*/ $scope.refreshpage = function(strpath);
}]);
至此,我們就可以按照這種方式來描述所有因為使用 angularjs 框架而新增的**部分了。其他的框架也可以使用相同的辦法來處理。這種處理方式是一種折中方案,如果想要更加規範、優雅的話,建議使用自定義標籤來解決。
JSDuck 與 AngularJS 融合技巧
字數 1568 前面,我們以乙個實戰案例來詳細說明了如何在實際開發中使用jsduck工具。但是,並不是所有的時候,的封裝方式都受我們控制的。例如,如果我們使用了現在的幾個主流框架angularjs react或者vue的時候,的封裝方式就必須按照框架定義的方式來構建。當我們的 現了模組 控制器 服務...
以應用為目的從零開始學習AngularJS
2018 8 25 學習開始 為angular註明管理範圍 ng init初始化資料,初始化後資料對整個頁面可見。以上結果所有位置輸出都是0 迴圈 繫結資料 對於輸入框而言 num就會跟隨輸入框的值變化而變化 ng controller scope.num 0 controller將num初始化為0...
五分鐘玩轉文件化工具JSDuck
字數 981 在經歷了數個上線的專案之後,筆者所在的團隊已經沉澱了乙個相對穩定版本的前端框架。因此,我們需要出具一套框架api文件,以便公司其他成員的使用和框架的後期維護。我們在對現在較主流的五個文件工具 jsdoc 3 yuidoc dox docco jsduck分別作了調研和嘗試,得到結論如下...