CML特色是「一端所見即多端所見」,你只需開發一次就能跑全部端。 跟隨這個教程,開啓你的chameleon跨端開發。php
開發chameleon項目的第一步是要安裝運行環境和全局安裝chameleon-tool。css
運行環境html
node >= 8.10.0 npm >= 5.6.0vue
建議安裝使用nvm管理node版本。node
npm i -g chameleon-tool
複製代碼
安裝成功後,執行 cml -v
便可查看當前版本, cml -h
查看命令行幫助文檔,更多命令參見腳手架工具。接下來就可使用它快速的建立chameleon項目。react
嚐鮮版android
嚐鮮版提供了百度小程序和支付寶小程序的支持
若是想提早使用可移步這裏查看使用webpack
cml init project
cml dev
web端能夠點擊模擬器內頁面右上角打開新的瀏覽器窗口。ios
native端的效果請下載chameleon playground(目前可下載Android端,IOS端即將發佈)或者下載weex playground掃碼預覽git
小程序端請下載微信開發者工具,打開項目根目錄下的 /dist/wx
目錄預覽。
支付寶、百度小程序正在alpha版本中,這裏查看使用。快應用正在測試中。
接下來,咱們一塊兒看看chameleon項目的目錄結構與代碼構成。
剛剛生成chameleon項目的目錄結構以下:
├── chameleon.config.js // 項目的配置文件
├── dist // 打包產出目錄
├── mock // 模擬數據目錄
├── node_modules // npm包依賴,基於多態協議直接使用各端原生組件
├── package.json
└── src // 項目源代碼
├── app // app入口
├── components // 組件文件夾
├── pages // 頁面文件夾
├── router.config.json // 路由配置文件
└── store // 全局狀態管理
複製代碼
編輯器中語法高亮,暫時使用
.vue
的插件,參見編輯器插件,後續會推出更強大的插件。
chameleon的目錄結構將組件、頁面、路由、全局狀態管理、靜態資源、模擬數據等按照功能進行劃分。更多參見目錄結構。 你能夠留意到這個項目中的app入口、組件和頁面下都是.cml
爲後綴的文件,接下來咱們就看看.cml
文件代碼構成。
從事過網頁編程的人知道,網頁編程採用的是HTML + CSS + JS這樣的組合,一樣道理,chameleon中採用的是 CML + CMSS + JS。咱們定義了擴展名爲.cml
的文件將一個組件須要的全部部分組合(CML、CMSS、JS邏輯交互、JSON配置)在一塊兒,更方便開發。
CML(Chameleon Markup Language)用於描述頁面的結構,咱們知道HTML是有一套標準的語義化標籤,例如文本是<span>
按鈕是<button>
。CML一樣具備一套標準的標籤,咱們將標籤訂義爲組件
,CML爲用戶提供了一系列組件。CML中還支持模板語法,例如條件渲染、列表渲染,數據綁定等等,更多參見CML。簡單舉例:
<template>
<view>
<!-- 數據綁定與計算屬性 -->
<text>{{ message }}</text>
<text class="class1">{{ message2 }}</text>
<!-- 條件與循環渲染 -->
<view c-if="{{showlist}}">
<view c-for="{{array}}" c-for-index="idx" c-for-item="itemName" c-key="city" >
<text> {{idx}}: {{itemName.city}}</text>
</view>
</view>
<!-- 事件綁定 -->
<view c-bind:tap="changeShow"><text>切換展現</text></view>
</view>
</template>
<script>
class Index {
data = {
message: 'Hello Chameleon!',
array: [{
city: '北京'
},
{
city: '上海'
},
{
city: '廣州'
}],
showlist: true
}
computed = {
message2: function() {
return 'computed' + this.message;
}
}
watch = {
showlist(newVal, oldVal) {
console.log(`showlist changed:`+ newVal)
}
}
methods = {
changeShow() {
this.showlist = !this.showlist;
}
}
}
export default new Index();
</script>
複製代碼
同時,CML支持使用類VUE語法,讓你更快入手。
CMSS(Chameleon Style Sheets)用於描述CML頁面結構的樣式語言,其具備大部分CSS的特性,也作了一些擴充和修改。
less
與stylus
。<style>
@import './global.css';
@size: 10px;
.header {
width: @size;
height: @size;
}
</style>
複製代碼
更多參見CMSS。
JS語法用於處理頁面的邏輯部分,cml文件<script></script>
標籤中的export default
導出的VM對象即採用JS語法。它負責業務邏輯、交互邏輯的處理與驅動視圖更新,擁有完整的生命週期,watch,computed,數據雙向綁定等優秀的特性,可以快速提升開發速度、下降維護成本。
<script>
class Index {
// data
data = {
message: 'Hello',
}
// 計算屬性
computed = {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
// 觀察數據變化
watch: {
message: function (newV, oldV) {
}
}
// 各類生命週期
mounted: function(res) {
// 模板或者html編譯完成,且渲染到dom中完成,在整個vue的生命週期中只執行一次
}
}
export default new Index();
</script>
複製代碼
base
對象爲各端共用的配置對象,都引組件demo-com
。wx、alipay、baidu
分別對應生成微信小程序、支付寶小程序和百度小程序的各自配置。更多參見組件配置。
<script cml-type="json">
{
"base": {
"usingComponents": {
"demo-com": "/components/demo-com/demo-com"
}
},
"wx": {
"navigationBarTitleText": "index",
"backgroundTextStyle": "dark",
"backgroundColor": "#E2E2E2"
},
"alipay": {
"defaultTitle": "index",
"pullRefresh": false,
"allowsBounceVertical": "YES",
"titleBarColor": "#ffffff"
},
"baidu": {
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "index",
"backgroundColor": "#ffffff",
"backgroundTextStyle": "dark",
"enablePullDownRefresh": false,
"onReachBottomDistance": 50
}
}
</script>
複製代碼
chameleon提供了豐富的基礎組件給開發者,開發者能夠像搭積木同樣,組合各類組件拼合成須要的功能。 就像 HTML 的 div, p 等標籤同樣,在chameleon裏邊,你只須要在 WXML 寫上對應的組件標籤名字就能夠把該組件顯示在界面上,例如,你須要一個switch開關組件,你只須要這樣寫:
<template>
<switch
checked="{{ switchValue }}"
label="Switch"
c-bind:change="switchChange"
>
</switch>
</template>
<script>
class Switch {
data = {
switchValue: false
}
methods = {
switchChange (e) {
this.switchValue = e.detail.value
}
}
};
export default new Switch();
</script>
<script cml-type="json">
{
"base": {}
}
</script>
複製代碼
使用組件的時候,還能夠經過屬性傳遞值給組件,讓組件能夠以不一樣的狀態去展示,例如checked
屬性用於控制switch的開關狀態: 組件的內部行爲也會經過事件的形式讓開發者能夠感知,例如c-bind:change
綁定change事件的處理函數爲switchChange
方法,在該方法中拿到改變的值,修改switchValue
的值。 更多的組件的使用參見組件。
chameleon封裝了豐富的基礎api庫chameleon-api
供開發者使用,這些api屏蔽了各平臺的底層接口差別,例如數據存儲功能,咱們只須要這樣使用,而不須要關心各端數據存儲接口的差別。
import cml from 'chameleon-api'
cml.setStorage('name', 'chameleon').then(()=>{
},function(err){
})
複製代碼
例如彈出toast方法,只須要這樣使用:
import cml from 'chameleon-api'
cml.showToast({
message: 'Hello chameleon!',
duration: 1000
})
複製代碼
注意:接口均以promise形式進行返回,因此你能夠結合異步流程控制如async、await進行操做。 更多API能力參見API
chameleon項目是應用級的項目,應用內容許多個頁面的存在,下面學習項目中多個頁面之間的路由管理與跨應用之間的跳轉。 chameleon項目內置了一套各端統一的路由管理方式,項目根目錄下的src/router.config.json
是路由的配置文件,內容以下:
{
"mode": "history",
"domain": "https://www.chameleon.com",
"routes":[
{
"url": "/cml/h5/index",
"path": "/pages/index/index",
"mock": "index.php"
}
]
}
複製代碼
hash
或history
。router.config.json
的內容,插入到app.json的pages字段,實現小程序端的路由。路由跳轉分爲應用內跳轉和應用間跳轉,chameleon-api
都提供了相應的方法:
例如應用內打開新頁面:
import cml from 'chameleon-api';
cml.navigateTo({
path: '/pages/page2/page2'
})
複製代碼
更多參見路由配置。
當項目中的組件和頁面愈來愈多,愈來愈複雜後,他們之間會出現共同管理數據狀態的狀況,這時咱們建議使用chameleon提供的全局數據管理chameleon-store
進行管理,它位於項目根目錄下的src/store
中,目錄結構以下:
└── store
├── action-types.js # 定義 actions 的類型
├── actions.js # 根級別的 actions
├── getter-types.js # 定義 getters 的類型
├── getters.js # 根級別的 getters
├── index.js # 咱們組裝模塊並導出 store 的地方
├── mutation-types.js # 定義 mutations 的類型
├── mutations.js # 根級別的 mutation
├── state.js # 組件初始狀態數據
└── modules # 子模塊
├── ...
複製代碼
相似 Vuex 數據理念和語法規範,chameleon-store 主要有如下核心概念:
經過 chameleon-store
建立的Store
實例,方法以下: ChameleonStore.createStore(options: Object): Object
更多參見數據管理。
能夠經過cml init project --demo todo
初始化todo
示例demo,學習其中對於數據管理的使用。
目前學習到如今,咱們都是利用一套代碼實現多端的開發,可是當你遇到特殊的狀況時,一套代碼沒法知足多端的需求時,chameleon提供的多態協議,可讓你自由的擴展API和組件。有以下幾種狀況:
注: 多態協議是Chameleon業務層代碼和各端底層組件和接口的分界點,是跨端底層差別化的解決方案,普通用戶開發基本上使用不到多態協議,由於chameleon已經使用多態協議封裝了豐富的組件和接口。
當咱們執行cml dev
進行開發時,就已經使用了chameleon的工程化能力,若是還想使用熱更新與自動刷新、調試窗口、mock數據、代碼的壓縮、資源發佈路徑、打包資源分析、文件指紋等功能就須要進一步的學習。
mock數據是本地開發必不可少的工做,chameleon項目中在mock
文件夾的文件中寫express中間件的形式mock數據,更多參見 數據mock,例如:
module.exports = [
{
method: ['get', 'post'],
path: '/api/getMessage',
controller: function (req, res, next) {
res.json({
total: 0,
message: [{
name: 'Hello chameleon!'
}]
});
}
}
]
複製代碼
chameleon的其餘工程化配置統一收斂在項目根目錄下的chameleon.config.js
文件,在該文件中可使用全局對象cml的api去操做配置對象。例如:
配置當前項目支持的端
cml.config.merge({
platforms: ['web','wx'],
});
複製代碼
配置是否進行文件壓縮
cml.config.merge({
web: {
dev: {
minimize: true
}
}
});
複製代碼
配置資源發佈路徑,分離線上和線下的資源路徑。
cml.config.merge({
web: {
build: {
publicPath: "http://www.chameleon.com/static"
}
}
});
複製代碼
更多配置參見工程配置
若是你既想一套代碼運行多端,又不用大刀闊斧的重構項目,能夠將多端重用組件用Chameleon開發,直接在原有項目裏面調用。參見導入與導出。也有以下手把手實例進行參考
若是你須要跨native端渲染,則須要接入chameleon SDK,目前支持的渲染引擎是 weex,即將支持 react native,使用時兩者選其一做爲項目的 native 渲染引擎。chameleon SDK包括對原生組件和本地api能力的擴展,對性能和穩定性的優化。使用方式能夠參見Android Chameleon SDK 與IOS Chameleon SDK。
chameleon提供了多種規範校驗,對這些規範的學習能夠提升開發效率,保證代碼質量。 接口校驗語法 是使用多態協議擴展多態組件和多態接口時使用。能夠經過配置進行開啓或者關閉。 全局變量校驗 是保證跨端代碼全局變量正確性的檢查方法,能夠經過配置進行開啓或者關閉。 代碼規範校驗 是對項目結構,文件規範,樣式規範等進行校驗,能夠經過配置進行開啓或者關閉。