SharePoint Framework 在web部件中使用已存在的JavaScript庫 - JavaScript庫的格式
部落格地址:http://blog.csdn.net/FoxDave
JavaScript庫格式
不同的JavaScript庫的編譯和打包方式各不相同。一些是以模組的方式打包的,而另一些是以純指令碼執行在全域性的方式。當從URL載入JavaScript庫時,你要如何註冊外部指令碼取決於指令碼的格式。指令碼的格式有許多中:AMD、UMD或CommonJS,但只需要知道該指令碼是不是一個模組即可。
在註冊打包為模組的指令碼時,唯一需要做的事情是指定特定指令碼需要從哪個URL載入。另一方面,非模組化指令碼需要最小範圍指令碼的URL(即.min.js)和全域性名稱變數。舉個例子,Angular v1.x是一個非模組化指令碼,我們在SPFx專案中將它註冊為外部資源,用如下程式碼指定它的URL和全域性名稱:
"angular": {
"path": "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js",
"globalName": "angular"
}
指定globalName屬性的值很重要,它與指令碼使用的名稱一致。這樣使指令碼能夠正確地將自己暴露給其他依賴它的東西。ngOfficeUIFabric - 一個依賴Angular的UMD模組。由於已經在模組內進行了依賴處理,在註冊它時你只需要指定URL:
"ng-office-ui-fabric": "https://cdnjs.cloudflare.com/ajax/libs/ngOfficeUiFabric/0.12.3/ngOfficeUiFabric.js"
jQuery時一個AMD指令碼,註冊它比較簡單,即"jquery": "https://code.jquery.com/jquery-2.2.4.js"
現在想象一下,你想要使用jQuery中的一個外掛,它時一個非模組化指令碼,這時如果使用以下程式碼進行註冊:"jquery": "https://code.jquery.com/jquery-2.2.4.js",
"simpleWeather": {
"path": "https://cdnjs.cloudflare.com/ajax/libs/jquery.simpleWeather/3.1.0/jquery.simpleWeather.min.js",
"globalName": "jQuery"
}
載入web部件很可能會發生錯誤,因為有可能兩個指令碼是並行載入的,外掛無法進行註冊。之前提到過,SPFx允許你指定非模組化外掛的依賴關係。這些依賴在globalDependencies屬性中設定:
"jquery": "https://code.jquery.com/jquery-2.2.4.js",
"simpleWeather": {
"path": "https://cdnjs.cloudflare.com/ajax/libs/jquery.simpleWeather/3.1.0/jquery.simpleWeather.min.js",
"globalName": "jQuery",
"globalDependencies": [ "jquery" ]
}
每一個依賴必須指向config/config.json檔案中的externals部分。現在如果你想要編譯專案,你會遇到另一個錯誤,提示你不能依賴非模組化指令碼。
要解決這個問題,你需要註冊jQuery為非模組化指令碼:
"jquery": {
"path": "https://code.jquery.com/jquery-2.1.1.min.js",
"globalName": "jQuery"
},
"simpleWeather": {
"path": "https://cdnjs.cloudflare.com/ajax/libs/jquery.simpleWeather/3.1.0/jquery.simpleWeather.min.js",
"globalName": "jQuery",
"globalDependencies": [ "jquery" ]
}
這樣simpleWeather指令碼就會在jQuery載入之後在自行註冊了。很難手工判斷想要載入的指令碼是模組化還是非模組化指令碼,特別是最小化的指令碼。如果你的指令碼在一個公網URL承載,你可以使用免費的Rencore SharePoint Framework Script Check工具來確定指令碼的型別。而且,該工具讓你能夠知道承載指令碼的位置是否正確配置。
非模組化指令碼的考慮
許多JavaScript庫和指令碼是非模組化指令碼。雖然SPFx支援載入非模組化指令碼,你還是應該避免去使用它們。
非模組化指令碼在頁面的全域性被註冊:一個web部件載入的指令碼對頁面上的其他web部件都可用。如果你有兩個web部件使用了不同版本的jQuery並且都載入為非模組化指令碼,最後載入的web部件會覆蓋之前載入的jQuery版本。你能想象,這可能會導致不可預見的結果並且不容易除錯問題。模組結構通過隔離指令碼並防止它們互相影響解決了這個問題。
什麼時候考慮捆綁打包
捆綁打包已存在的JavaScript庫到你的web部件會生成尺寸較大的web部件檔案,導致頁面的低效能。儘管我們應該避免這樣使用,但一些情況下還是有優勢的。
如果你編譯一個標準的解決方案,這個解決方案會在很多內網執行,那麼整體捆綁打包會幫助你確保你的web部件會正確工作,因為你不知道你的解決方案安裝在哪裡,不知道那裡能不能從外部資源載入指令碼,那麼整體打包就會確保你引用的資源都可以成功載入到。
如果你的解決方案由許多web部件組成,有一些共享的函式,那麼可以考慮將這些共享的函式單獨編譯成庫並作為外部資源在所有web部件中引用。
總結
通過前面一篇和本篇,在編譯客戶端web部件時,SPFx允許我們捆綁打包將這些庫跟web部件打包到一起,或者作為外部資源載入。雖然從外部URL載入已存在的庫是推薦的方式,還是有一些情況採用捆綁打包更適合。
相關文章
- SharePoint Framework 在web部件中使用已存在的JavaScript庫 - 捆綁打包和外部引用FrameworkWebJavaScript
- SharePoint Framework 向web部件中新增外部庫FrameworkWeb
- SharePoint Framework 構建你的第一個web部件(三)FrameworkWeb
- SharePoint Framework 構建你的第一個web部件(一)FrameworkWeb
- SharePoint Framework 構建你的第一個web部件(二)FrameworkWeb
- SharePoint Framework 把你的客戶端web部件連線到SharePointFramework客戶端Web
- SharePoint Framework 配置你的SharePoint客戶端web部件開發環境Framework客戶端Web開發環境
- SharePoint Framework 把你的客戶端web部件部署到經典的SharePoint頁面Framework客戶端Web
- SharePoint Framework 在web部件中使用第三方樣式 - 將第三方樣式打到包中FrameworkWeb
- 遷移已存在的資料庫到ASM中資料庫ASM
- 推薦一個markdown格式轉html格式的開源JavaScript庫HTMLJavaScript
- SharePoint Framework 開發工具和庫Framework
- SharePoint Framework 在web部件中使用第三方樣式 - 從外部URL引用第三方樣式FrameworkWeb
- gRPC-Web:替代REST的gRPC的Javascript庫包RPCWebRESTJavaScript
- 打造自己的JavaScript工具庫JavaScript
- 打造自己的JavaScript武器庫JavaScript
- “使用者、組或角色'XXX'在當前資料庫中已存在”問題資料庫
- jQuery使用最廣泛的javascript函式庫jQueryJavaScript函式
- javascript類庫JavaScript
- 資料庫別名已存在的解決方法資料庫
- 必須知道的JavaScript庫 - 視覺化庫JavaScript視覺化
- 詳解JavaScript中的嵌入式資料庫JavaScript資料庫
- javascript中檢測某個字串在陣列中是否存在JavaScript字串陣列
- 不可錯過的javascript迷你庫JavaScript
- 深受 Pandas 啟發的 JavaScript 開源庫 — Danfo.js 現已推出!JavaScriptJS
- validator庫在gin中的使用
- 流行 Javascript 庫在安裝時展示廣告JavaScript
- 推薦10款優秀的JavaScript Web UI庫 框架和套件JavaScriptWebUI框架套件
- Snap.svg – 現代Web開發必備的JavaScript SVG 庫SVGWebJavaScript
- JDataset 簡單的Javascript ORM FrameworkJavaScriptORMFramework
- 3.5 JavaScript——常用庫JavaScript
- 使用JavaScript手寫一個簡單的快捷鍵庫JavaScript
- iOS中的動態庫,靜態庫和framework介紹iOSFramework
- ORACLE從資料庫中獲取已存在的TABPLESPACE及INDEX建立指令碼Oracle資料庫Index指令碼
- 使用jQuery在javascript中自定義事件jQueryJavaScript事件
- 6 款 Javascript 的影像處理庫JavaScript
- urlcat:JavaScript的URL構建器庫JavaScript
- [分享] 最流行的 10 個 JavaScript 庫JavaScript