亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jNs 在 ASP.NET MVC 項目中的應用

發布時間:2020-07-16 10:55:42 來源:網絡 閱讀:1753 作者:邊城__ 欄目:編程語言

最近做項目用到 ASP.NET Web Optimizatoin Framework,發現 Sea.js 的依賴加載在 Release 版本下不能很好的工作了——因為 Web.Optimizatoin 合并了所有腳本。同時由于寫慣了 Java 
程序和 C# 程序,對于沒有命名空間概念的 Sea.js 和 RequireJS 也感覺不爽。考慮了下,覺得模塊管理其實并不復雜,所以將之前在《ASP.NET MVC4 捆綁(Bundle)技術下的 JavaScript》 中提到的 js-modular 的基礎上進行了改進,最終產生了 jNs。

jNs 是一個具有命名空間概念的 JavaScript 模塊管理工具。與 Sea.js 和 ReqireJS 等模塊管理工具不同,jNs 只管理模塊的定義和使用,而不負責加載,非常適合發布合并 JavaScript 代碼的 Web 項目,比如使用了 ASP.NET Web Optimization Framework 提供的 Script Bundle 功能的 ASP.NET 項目,以及使用 UglifyJS 壓縮合并腳本的項目等。

jNs 托管在 git.oschina.net 上,其 README 中已經有詳情的示例,所以這里就不廢話了。這里主要說說在 ASP.NET MVC 項目里怎么使用。

第一,定義合理的腳本結構

下面展示了一個來自某個實際項目的腳本目錄(有所精簡),也許不是最好的結構,但我個人覺得很清晰(用方括號 []括起來的是目錄)。

[Scripts]
  │ - jNs-1.0.0.js
  │ - jNs-1.0.0.min.js
  │ - jquery-2.1.3.js
  │ - jquery-2.1.3.min.js
  ├─[core]
  │   └─[co]
  │       │ - app.js
  │       │ - compatible.js
  │       │ - util.js
  │       ├─[app]
  │       │   │ - ajax.js
  │       │   │ - dialog.js
  │       │   │ - page.js
  │       │   └ - ui.js
  │       └─[util]
  │           │ - case.js
  │           │ - debug.js
  │           └ - format.js
  └─[page]
      ├─[home]
      │   └ - index.js
      └─[user]
          └ - index.js

其中有兩個比較關鍵的主目錄,一個是 core,一個是 page

core 是整個項目中需要使用到的模塊,在 bunles 中配置成一個名為 ~/bundle/core 的 ScriptBundle。Release 版本下會被打包成一個合并的腳本文件。大部分的頁面只需要引用 ~/bundles/core 就可以了,因為大部分的公用邏輯都在這里了。

但是仍然會有一部分頁面比較特殊,需要有自己的腳本。那么這些腳本就按一定的路徑保存在 page 目錄下。

core 中的目錄結構與模塊的結構對應,這樣查找腳本文件的時候就比較方便,比如示例中的結構對應的模塊全稱(含命名空間)就是:

co.app
co.app.ajax
co.app.dialog
co.app.page
co.app.ui
co.compatible
co.util
co.util.case
co.util.debug
co.util.format

這個結構看起來就像 Java 一樣。不過與 Java 不同,目錄不必與命名空間(或包)對應,文件名也不必與模塊名相同——這似乎更像 C#。

還有一點需要注意的是,在同一個命名空間下,子級命名空間和模塊名是可以相同的,這也算是 jNs 的特點之一吧。

有了合理的結構,還需要解決下面這個問題。

第二,保證 jNs.js 在模塊定義之前加載

雖然一般認為在 ScriptBunlde 中 Include 的腳本會順序加載,或者說在 Release 版本下按順序合并,所以認為可以這樣寫配置:

// BundleConfig.cs
// 注意:這是錯誤的示例
public static void RegisterBundles(BundleCollection bundles)
{
    bunles.Add(new ScriptBundle("~/bundles/core")
        .Include("~/scripts/jNs-{version}.js").
        .IncludeDirectory("~/scripts/core/", "*.js", true)
    );
}

可惜事實不是。我閱讀了它的源碼,發現它使用了一個 Dictionary 來進行中間過程的處理,所以最終輸出的順序完全是不確定的。所以 jNs 有可能在某個模塊文件之后加載,那么模塊文件中的 jNs(...) 就會出錯——因為還沒定義。

不過很幸運,Web.Optimization 提供了 IBundleOrderer 接口來處理順序的問題。我比較懶,所以不想直接去實現IBundleOrderer 接口,而是從 DefaultBundleOrderer 繼承了個子類來處理順序——不管 DefaultBundleOrderer 是怎么處理的,我只需要在它處理之后按輸入的順序重新排列一下就好了

public class AsIsBundleOrderer : DefaultBundleOrderer
{
    public override IEnumerable<BundleFile> OrderFiles(
        BundleContext context,
        IEnumerable<BundleFile> files
    )
    {
        var originalList = files.ToList();
        IEnumerable<BundleFile> orderFiles = base.OrderFiles(context, originalList);
        return orderFiles.OrderBy(f => originalList.IndexOf(f));
    }
}

在有 AsIsBundleOrderer 之后,再來看看正確的 Bundle 配置

public static void RegisterBundles(BundleCollection bundles)
{
    var bundle = new ScriptBundle("~/bundles/core")
        .Include("~/Scripts/jNs-{version}.js")
        .IncludeDirectory("~/Scripts/core/", "*.js", true);
    bundle.Orderer = new AsIsBundleOrder();
    bundles.Add(bundle);
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仪征市| 潮安县| 咸丰县| 衡水市| 朝阳市| 漾濞| 江门市| 苍溪县| 平利县| 林芝县| 会东县| 苍山县| 大洼县| 洪雅县| 定陶县| 周至县| 柳林县| 大田县| 毕节市| 礼泉县| 天水市| 沙雅县| 商河县| 夹江县| 花垣县| 当雄县| 太白县| 绥江县| 台北县| 苍梧县| 沂水县| 九台市| 翼城县| 福海县| 汕尾市| 南充市| 将乐县| 南投县| 崇阳县| 花莲县| 武夷山市|