使用 spm 和 SeaJS
轉載自:https://github.com/spmjs/spm/wiki/Hello-spm%EF%BC%9A%E4%BD%BF%E7%94%A8-spm-%E5%92%8C-SeaJS-%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E4%B8%AD%E5%9E%8B%E9%A1%B9%E7%9B%AE
現在我們要正兒八經開始開發一個叫 hello-spm 的專案了,別笑,雖然只是個為了讓你更好的瞭解 SPM 而杜撰出來的專案,但也五臟俱全。
在正式開始之前,我還是要囉嗦一句,所有的範例程式碼都是基於 SeaJS 的, 請確保你已經知道該怎麼使用 SeaJS 了。
建立專案目錄
我們先來看看專案的整體結構
hello-spm/ assets/ hello/ util/ sea-modules/ package.json index.html
- 考慮到真實的專案通常包含前後端的程式碼,所有前端程式碼放在 assets/ 。
- hello 和 util 是為本專案編寫的模組。
- sea-modules/ 用於存放安裝和部署的模組。如果你的專案基本都是基於 SeaJS 和 SPM 的,你可以把這個目錄放置在和專案目錄平級的路徑下,以便各專案公用。
- package.json 為模組打包部署的總體配置。
- index.html 為專案頁面。
安裝需要的模組
顯然,我們需要用到 seajs 和 jquery,所以要使用 spm install
開啟命令列工具,將路徑切換至 sea-modules/ ,執行:
spm install seajs spm install [email protected]
這時你會發現 sea-module/ 中多了 seajs 和 jquery 兩個模組。其中 seajs 為最新版本, 而 jquery
則是我們安裝時指定的 1.8.3 版本。其中 jquery 目前的 root 是 gallery,所以會增加一個 gallery 目錄。
建立模組
回想一下 index.html 執行的效果,多處用到了隨機數,例如 "hello spm !" 的單個字元大小,字串出現在頁面中的位置以及字串在頁面上停留的時間。
我們把這樣一個可產生指定範圍的隨機整數的工具方法放到 util 模組中。
下面我們來 初始化 這個模組。
命令列工具路徑切換至 util/ ,執行:
spm init
spm 會在 util/ 中建立以下檔案:
util/ examples/ src/ tests/ package.json README.md
其中:
- examples/ 用於存放演示檔案。
- src/ 為模組原始碼,打包後的檔案會存放到和 src/ 平級的 dist/ 目錄下。
- test/ 用於存放測試用例,你可以使用 jasmine 等工具來保障程式碼的質量。
- package.json 為本模組打包部署的配置。
我們的 hello-spm 實在有點簡單,所以演示程式碼僅保留了 src/ 和 package.json 這兩個必備部分。
src/ 中只有 util.js 一個檔案, 原始碼非常簡單,如下:
define(function(require, exports) { exports.random = function(min, max){ return min + Math.round(Math.random() * (max - min)) } })
拆分子模組
接下來我們處理相對複雜一些的 hello 模組,他要做這麼幾件事情:
- 建立字元大小隨機的 "Hello SPM !" 字串。
- 隨機顯示到頁面上。
- 一段時間後自動消失。
這個模組複雜到需要拆分成多個子模組來進行開發 (好吧,我承認這純粹是教程需要)。使用 spm init 初始化後,在 src/ 中除了預設建立的 hello.js,還需要手工建立一個 handle-text.js 檔案。
hello.js 完成大部分的主體功能,而 handle-text.js 專門負責處理傳入字串的隨機字元大小。
hello.js 的原始碼如下:
define(function(require, exports, module) { var $ = require('$') var random = require('util').random var handleText= require('./handle-text') function Hello(){ this.render() this.bindAction() seajs.log('new Hello() called.') } Hello.prototype.render = function(){ this.el = $('<div style="position:fixed;' + 'left:' + random(0,70) + '%;' + 'top:' + random(10,80)+ '%;">' + handleText('Hello SPM !') + '</div>').appendTo('body') } Hello.prototype.bindAction = function(){ var el = this.el setTimeout(function(){ el.fadeOut() }, random(500,5000)) } module.exports = Hello })
注意 :
- var random = require('util').random 是模組方法的引用。
- var handleText= require('./handle-text') 是子模組的引用。
- 在 Hello 類的構造器中,我們還使用 seajs.log 打了一句日誌。
更多 require 的說明可檢視 SeaJS 的 模組標識
handle-text.js 的原始碼如下:
define(function(require, exports, module) { var $ = require('$') var random = require('util').random function handleText(text){ var min = random(30,70) var max = random(50,120) var rt = '' for(var i = 0, len = text.length; i < len; i++){ rt += '<span style="font-size:' + random(min, max) + 'px;">' + text[i] + '</span>' } return rt } module.exports = handleText })
編寫開發時頁面
開發過程中,我們就常常需要編寫一些測試用例,或者演示頁面。
這種情況下我們希望模組是不需要打包的,並且可以檢視日誌,以便除錯。
本例中,我們並沒有為單個模組建立單元測試或者演示頁面。簡單起見,我們在 index.html 頁面中編寫了一些開發時的程式碼,程式碼如下:
<div style="text-align:center;font-size:48px;color:#999;"> Press the space key !</div> <script src="assets/sea-modules/seajs/1.3.0/sea-debug.js"></script> <script> seajs.config({ alias:{ '$':'gallery/jquery/1.8.3/jquery.js', 'util':'../../util/src/util.js' } }) seajs.use(['$','./assets/hello/src/hello.js'],function($, Hello){ $(document).keypress(function(ev){ if(ev.which == 32){ new Hello() } }) }) </script>
注意:
- 引用 sea-debug.js,可以開啟 debug 功能。
- jquery(即 $ )作為 DOM 操作最常使用的模組,總是需要通過 seajs.config 手工配置別名,確保專案內的統一。比如 1.8.3 版本。
- seajs.use 中的 '$' 為頂級 模組標識,相對於 seajs 的 base 路徑, './assets/hello/src/hello.js' 為相對標識,相對於當前頁面 url。
現在執行 indexg.html 就能看到效果了,原始碼上做任何的改動也能立馬體現,開啟除錯工具,你還能看到打出的 log。
打包部署
打包配置
結束編碼測試工作後,我們就要準備將模組打包部署,以供正式環境使用了。打包相關的配置都寫在每個模組的 package.json 中了。
先來看看 util 模組的 package.json
{ "name":"util", "parent":"../package.json", "output":{"util.js":"."} }
- name 為模組名
- parent 指定用於繼承的父級配置,路徑相對於該配置檔案。當你專案中的模組有大量公共配置的時候推薦使用此項.
- output 指定了將 src/util.js 及其模組內的依賴打包為 dist/util.js 。當然,這裡 src/util.js 沒有模組內依賴。
再接著看 hello 模組的 package.json
{ "name":"hello", "parent":"../package.json", "output":{"hello.js":"."}, "dependencies": { "$": "$", "util":"hellospm/util/0.0.1/util" } }
然後我們還有一個 parent package.json
{ "root": "hellospm", "version": "0.0.1" }
其中由於我們 hello 和 util 模組的 root 和 version 是一樣的,我們就可以把他放到 parent 的配置中。
絕大部分和 util 模組的配置一樣,只是多了一項 dependencies,需要注意的是:
jquery 作為一個特殊的模組,打包的時候並不指定具體的依賴,僅寫上 "$": "$" 即可。
回顧一下,就是因為這個原因,我們在剛剛建立的 index-debug.html 中,還需要為 jquery 配置別名: '$':'gallery/jquery/1.8.3/jquery.js' 。
接下來我們將以 util 模組為例講解模組的打包部署(hello 模組的打包部署方式完全一樣)。
打包
命令列進入到 util/ ,執行:
spm build
SPM 會在 util/dist/ 目錄建立 util.js 和 util-debug.js 兩個檔案。有興趣的讀者可以開啟 util-debug.js 看看打包後的檔案和原始碼有何不同。
部署
為了方便演示,我們準備把打包好的模組部署到本地。
進入 util/ ,執行命令:
spm deploy --to=../sea-modules
這時 sea-modules/ 會新增 util 模組:
sea-modules/ hellospm/ util/ 0.0.1/ util.js util-debug.js ...
編寫正式頁面
勝利就在眼前,我們終於要完成這個專案了。現在我們要把測試用的 index.html 轉換成線上正式執行的 index.html,程式碼如下:
<div style="text-align:center;font-size:48px;color:#999;"> Press the space key !</div> <script src="assets/sea-modules/seajs/1.3.0/sea.js"></script> <script> seajs.config({ alias:{ '$':'gallery/jquery/1.8.3/jquery.js' } }) seajs.use(['$','./assets/sea-modules/hellospm/hello/0.0.1/hello.js'],function($, Hello){ $(document).keypress(function(ev){ if(ev.which == 32){ new Hello() } }) }) </script>
注意 index.html 前後的一些區別:
- index 引用的是 sea.js。
- SPM 在對模組進行打包部署後,依賴關係已經處理好了,所以這裡我們只用在 seajs.config 中配置 jquery($) 。
結束語
相關推薦
使用 spm 和 SeaJS
轉載自:https://github.com/spmjs/spm/wiki/Hello-spm%EF%BC%9A%E4%BD%BF%E7%94%A8-spm-%E5%92%8C-SeaJS-%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E4%B
CMD和seaJS
jsCMD(Common Module Definition)表示通用模塊定義,該規範是國內發展出來的,由阿裏的玉伯提出。就像AMD有個requireJS,CMD有個瀏覽器的實現SeaJS,SeaJS和requireJS一樣,都是javascript的模塊化解決方案。本文將詳細介紹CMD和seaJS CMD
前端模組化兩兄弟——requireJS和seaJS
寫在前面 之前沒學過nodeJS,底子不好,對AMD和CMD的實現沒法理解,現在nodeJS也算是步入門檻,再回過身好好研究一下這個“模組化載入器”。http://jafeney.com/2016/01/10/2016-01-10-module/ SeaJS與Requ
grunt和seajs的打包初體驗
seajs作為前端模組載入器,在依賴管理方面是挺方便的,用起來也還算比較簡單。不過,由於模組化使得模組劃分比較細,所以載入一個頁面將會發起多次http請求,這在生產環境中是不可接受的。一般而言,生產環境下,資源會放在CDN,而資源本身,通常會進行合併及壓縮。
我的前端之旅第一彈--SeaJs基礎和spm編譯工具運用[圖文]
1. 概述 本文章來源於本人在專案的實際應用中寫下的記錄。因初期在安裝和使用Seajs和SPM的時候,有點不知所措的經歷。為此,我們編寫本文件,通過圖文並茂的方式來為大家講解seajs和spm編譯環境的搭建和基本使用方法。 2. 認識SEAJS seajs是一種前端模組化
seaJS簡介和完整實例
化工 area 初始化 完成 har 自動 end href out 什麽是 seaJS ? 和requireJS相似的,seaJS 也是用JavaScript編寫的JS框架,主要功能是可以按不同的先後依賴關系對 JavaScript 等文件的進行加載工作,可簡單理解為J
seaJS 簡要介紹和完整例子
1,seajs.config({...}); //用來對 Sea.js 進行配置。 2,seajs.use(['a','b'],function(a,b){...}); //用來在頁面中載入一個或多個模組。 3,define(function(require, exports, module){...
SeaJS簡介三:模組載入和引用
之前對模組有過介紹,一個模組對應一個js檔案,而載入模組時一般都是提供一個字串引數告訴載入函式需要的模組,所以就需要有一套從字串標識到實際模組所在檔案路徑的解析演算法。SeaJS支援如下幾
Gulp,grunt,seajs/require和browserify/webpack的區別
Gulp / Grunt 是構建工具,可以配合各種平臺上的外掛做js壓縮,各種css編譯,頁面自動重新整理,檢查語法等,替代手工實現自動化開發 seajs/require和browserify/webpack 這4個都是js模組化的方案 seajs / require:是一種線上"編譯"
seajs+spm之再研究
好久沒有用seajs了,之前對spm也只是一知半解,這些天再次拿起來研究.談談我的認識與理解. 宣告:本文不適合對seajs完全不瞭解的同學閱讀.對於想知道seajs來龍去脈以及spm相關的同學"可能"有幫助.對於我自己也是個梳理的機會. 一.seajs部分 1.seajs由來: 傳統web前端的js
構建seajs業務模組之grunt VS spm build
在最開始,我並不知道grunt可以構建CMD模組.(以下spm指代spm build) 當時正困惑於如何用spm方便的構建業務模組,後來看到@twinstony (感謝@twinstony的分享)使用grunt-cmd-xxx外掛構建了CMD模組,跟著demo自己做了測試,的確可以構建,但是有一個問題:
(四)seajs.config中vars、alias、paths和map的作用,以及util-path路徑解析原始碼
這篇文章主要是學習下seajs.config中vars、alias、paths、map這4個配置引數的作用和使用方式。這4個配置都會影響一個模組最終的url路徑。 alias seajs.config({ base: 'http://www.main.com/b
支援seaJs和requireJs的前端模組開發方案(一):方案介紹
1.前言 本系列文章將介紹本人開發並在使用一套前端模組化開發方案,支援seaJs和requireJs兩種模組模式。方案適合多前端人員同時開發協作,也適合個人單獨使用。 方案不算複雜,但是不太習慣CSDN的編輯器,並且本人不善寫文,有些地方可能格式交亂或者表達不夠清晰,如有不
Reduce 和 Transduce 的含義
span 開發 opera clas 當前 form 基本功 通過 handle 一、reduce 的用法 reduce是一種數組運算,通常用於將數組的所有成員"累積"為一個值。 var arr = [1, 2, 3, 4]; var sum = (a, b) =&g
7.Spring切入點的表達式和通知類型
ice span rac 後置 owin err logs 異常 環繞 1.切入點的表達式 表達式格式: execution([修飾符] 返回值類型 包名.類名.方法名(參數)) 其他的代替: <!-- 完全指定一個方法 --> <!-- <a
關於CUDA兩種API:Runtime API 和 Driver API
ive uda ++ etime bsp con spa runt cuda CUDA 眼下有兩種不同的 API:Runtime API 和 Driver API,兩種 API 各有其適用的範圍。高級API(cuda_runtime.h)是一種C
數據結構--Avl樹的創建,插入的遞歸版本和非遞歸版本,刪除等操作
pop end eem static cout 遞歸 sta div else AVL樹本質上還是一棵二叉搜索樹,它的特點是: 1.本身首先是一棵二叉搜索樹。 2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值最多為1(空樹的高度為-1)。 也就是說,AV
函數模版和主函數分別在.h .cpp中(要包含.cpp)
spa end pragma test ios his 函數 private () Complex.h #pragma once #include<iostream> using namespace std;//這句還必須加,要不然致錯,不懂為啥呢 te
mybatis強化(二)Parameters和Result
pan har java onf 關系 throws efault type throw 本文通過一個簡單例子簡單記錄下參數的映射。轉載註明出處:http://www.cnblogs.com/wdfwolf3/p/6804243.html,謝謝。文件目錄如下, 1.配置文
典型用戶和場景
目的 本科 查看 如何 表格 自己 服務 表示 用戶 分析我們psp表的典型用戶和場景 老師: (1)姓名:王建民 (2)年齡:35 (3)收入:不詳 (4)代表的用戶在市場上的比例和重要性:我們軟件針對於信息學院學生,比例大概為1:200,老師是檢查學生能力的人員,是不可