jspm & SystemJS 教程

<nav id="myaffix">

目錄

</nav>

我的經驗,前端開發上要解決的問題能簡單分為兩個階段:

  1. 開發階段
  2. 部署階段

其中開發階段要解決:

  1. 第三方包安裝、使用、依賴關系的維護
  2. 自有代碼的依賴關系維護及使用

先來聊聊開發階段的解決方案。

包管理器#

最初在 jQuery 站點上,文檔可能是這樣寫的:

  1. 下載 jquery.min.js 文件
  2. 保存到 js 目錄
  3. 在 HTML 文件中使用 script 標簽引用 jquery

因為 jQuery 不依賴其它庫,所以相對來說,上面的操作還算簡單。

但如果碰上有依賴關系的,比如 Bootstrap 依賴于 jQuery,我們可能就需要分開下載 Bootstrap 與 jQuery。好在這一類第三方庫通常都在下載文件中打包好依賴了。但這樣又有一個問題,如果另一個庫也同樣打包一個 jQuery,并且版本與 Bootstrap 里打包的不一致呢。可以想像,這樣的情況并不少見,我們的開發目錄最終容易失控 – 添加包很容易,刪除就難了。另外,手工來做這件事,效率太低。

包管理器的意義就在這里。它封裝了細節,自動化處理我們的需求。我們只需要提問題,它們提供答案:

  1. 我要使用 jQuery – 好,bower install jquery
  2. 我要使用 Bootstrap – 好, bower install bootstrap,順便會把依賴 jQuery 一起安裝了
  3. 我想了想,還是刪除 Bootstrap 吧 – 好, bower uninstall bootstrap

包管理器會維護一個依賴清單,個中關系一目了然。

當然,以上只是用 bower 舉例,市面上同類產品還非常多,比如 duojs,本文的主角 jspm 也是一個,甚至 npm 都算。

加載器#

包管理器解決了我們管理各種模塊的需求。接下來,我們要利用這些模塊來開發,那么就會碰上如何使用這些模塊的問題了。

目前 ES6 模塊的標準還沒在瀏覽器中得到完全落實,過渡期間我們有許多規范或不規范的模塊:

  1. CommonJS
  2. AMD
  3. ES6 Modules
  4. 命名空間方式定義
  5. 其它

如果只使用單一規范,比如針對 AMD,我們可能會用 RequireJS;ES6 的模塊,我們可能會用到 ES6 Module Loader Polyfill;CommonJS 規范的模塊,我們可能用 SystemJS – 它同樣可用于加載 AMD/ES6 模塊。

CSS 加載器??

上面提及的加載器,通常是針對 JavaScript 模塊的,CSS 并沒有嚴格意義的模塊,那它怎么管理?我們的包管理器當然會連著包的 CSS 文件一同管理。那我們該如何使用這些模塊中的 CSS 呢?舉 SystemJS 來說,我們可以通過它的插件執行 import 命令動態插入 CSS。打包的時候,SystemJS 默認會把整個 CSS 文件打包入 JS 文件中。當然,我們也可以借助 bower 與 gulp.js 及 gulp.js 的 wiredep 插件 這樣的組合實現在頁面上「主動」插入 link 標簽 – 但這需要搭配 gulp.js 等工具。

走完開發階段,我們來看看部署階段要解決的幾個明顯問題:

  1. CSS 文件合并、壓縮等
  2. JavaScript 文件合并、壓縮、混淆等

不過,還是先正式介紹 jspm 與 SystemJS 的用法。

jspm#

如前所說的,jspm 是一個瀏覽器端包管理器。

安裝 jspm

npm install jspm -g

初始化目錄

在安裝完 jspm 后,我們在命令行下就有一個 jspm 命令可用。

創建一個目錄,執行 jspm init 即可在該目錄下初始化開發環境:

Package.json file does not exist, create it? [yes]: 
Would you like jspm to prefix the jspm package.json properties under jspm? [yes]: 
Enter server baseURL (public folder path) [.]: 
Enter jspm packages folder [./jspm_packages]: 
Enter config file path [./config.js]: 
Configuration file config.js doesn't exist, create it? [yes]:
Enter client baseURL (public folder URL) [/]: 
Which ES6 transpiler would you like to use, Traceur or Babel? [traceur]:

如果你用過 yeoman 一類工具,對這類提示應該非常熟悉。

安裝第三方庫

比如要安裝 jQuery:

jspm install jquery

這條命令會從 github:components/jquery 上讀取下載。

還可以從 npm 上下載安裝:

jspm install npm:jquery

創建 HTML 文件

創建一個 index.html 文件如下:

 <!doctype html>
  <script src="jspm_packages/system.js"></script>
  <script src="config.js"></script>
  <script>
    System.import('app');
  </script>

首先我們需要引用 jspm_packages/system.js,這個是 jspm 提供的萬用加載器。之后是 config.js 文件,我們安裝的各種包、依賴等信息都在這個文件中維護,之后我們用全局的 System.import 執行 index.html 同一目錄下的 app.js 文件。

在 app.js 文件中,我們使用 ES6 語法:

import $ from 'jquery';
$(function() {
  console.log($);
});

假定我們要在 index.html 中使用 Bootstrap,那么先通過 jspm 安裝:

jspm install bootstrap

然后把 app.js 文件修改如下:

import bootstrap from 'bootstrap';

$(function() {
    console.log($);
});

我們并沒有 import jQuery,這是因為 jspm 維護有 bootstrap 的依賴,會自動加載 jQuery,不需要我們再手動 import

import bootstrap from 'bootstrap' 一行是加載了 Bootstrap 的 js 模塊。那么,Bootstrap 的 CSS 部分如何加載呢?我們需要用到 jspm 的 CSS 插件

首先,安裝 jspm 的 css 插件:

jspm install css

然后在 app.js 中添加一行:

import 'bootstrap/css/bootstrap.css!';

! 表示這會經過插件處理。

這時如果在本地服務器上打開 index.html 文件,借助瀏覽器的開發者工具查看:

[resp_image id=’16028′ caption=” ]

Wow,請求有點多 – 但這只是開發階段。

打包 JavaScript

我們終于說到 JavaScript 的打包了。

jspm 里,js 文件的打包非常簡單,舉上面的例子說,如果我們只有一個 js 入口的話,則執行:

jspm bundle-sfx app build.js --minify

就可以將所有需要的 js 文件包括 CSS 文件打包到一個 build.js 文件中。

之后修改 index.html 文件中 script 部分如下:

<!--    <script src="jspm_packages/system.js"></script>
    <script src="config.js"></script>
    <script>
        System.import('app');
    </script>-->
    <script src="build.js"></script>

這時打開 index.html 頁面,就只剩下 index.html 與 build.js 兩個請求了。

打包 CSS

在上在一個步驟中,我們把 CSS 文件連著一起打包進了 js 中,這可能并不是多數人想要的結果。

我們可以通過定義 config.js 文件改變這種行為。

打開 config.js 文件,添加 seperateCSS: true

System.config({
  "baseURL": "/",
  "separateCSS": true
});

再次執行 jspm bundle-sfx app build.js --minify,會在 index.html 同級目錄下生成一個 build.js 與 build.css,在 index.html 中引用 build.css 文件即可。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 webpack介紹和使用 一、webpack介紹 1、由來 ...
    it筱竹閱讀 11,212評論 0 21
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,779評論 1 92
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,214評論 7 35
  • 靈感來源——林憶蓮《柿子》,聽這首歌的時候特別想寫一些文字獻給《柿子》 抓不住風的尾巴將其阻隔 握不緊手中的沙將其...
    MMXI閱讀 536評論 0 2
  • 我站在后海一家名叫“停駐”的pub門口,手心冒汗,動彈不得。 隔幾步的距離,對面一位帥氣的singer,眼神若有似...
    金環閱讀 222評論 0 1