摘要:今天,為了讓大家的項(xiàng)目優(yōu)雅升級,快速接入,給你帶來一份豐盛的遷移指南目錄結(jié)構(gòu)和微信小程序一樣,包含一個(gè)描述整體程序的和多個(gè)描述各自頁面的。
cml 作為真正讓一套代碼運(yùn)行多端的框架,提供標(biāo)準(zhǔn)的MVVM模式,統(tǒng)一開發(fā)各類終端。
同時(shí),擁有各端獨(dú)立的 運(yùn)行時(shí)框架(runtime)、數(shù)據(jù)管理(store)、組件庫(ui)、接口(api)。
此外,cml在跨端能力加強(qiáng)、能力統(tǒng)一、表現(xiàn)一致等方面做了許多工作。
今天,為了讓大家的項(xiàng)目優(yōu)雅升級,快速接入,給你帶來一份豐盛的cml遷移指南~
目錄結(jié)構(gòu)和微信小程序一樣,cml 包含一個(gè)描述整體程序的 app 和多個(gè)描述各自頁面的 page。
小程序目錄結(jié)構(gòu). ├── components // 包含各個(gè)組件 ├── pages // 包含各個(gè)頁面 ├── app.js // 包含各個(gè)組件 ├── app.js // 應(yīng)用啟動入口 ├── app.json // 全局配置 ├── app.wxss // 全局樣式 └── project.config.json // 項(xiàng)目配置文件cml目錄結(jié)構(gòu)
. ├── dist // 各個(gè)端構(gòu)建結(jié)果 │ ├── alipay │ ├── baidu │ ├── wx │ ├── web │ ├── weex │ └── config.json // 跨端配置map映射表 ├── node_modules // 第三方庫 ├── mock // 模擬 接口數(shù)據(jù) 和 模板數(shù)據(jù) ├── src // 源代碼開發(fā)目錄 │ ├── app // 應(yīng)用啟動入口 │ ├── assets // 靜態(tài)資源 │ ├── components // 包含組件 │ ├── pages // 包含頁面 │ ├── store //數(shù)據(jù)管理 │ └── router.config.json // 路由配置文件 ├── chameleon.config.js // 項(xiàng)目配置文件 └── package.json // npm包配置文件如何修改配置
在小程序項(xiàng)目里面,分為:
小程序 —— 項(xiàng)目配置可以在項(xiàng)目根目錄使用 project.config.json 文件對項(xiàng)目進(jìn)行配置。
配置示例:
{ "miniprogramRoot": "./src", "debugOptions": {} }小程序 —— 全局配置
小程序根目錄下的 app.json 文件用來對微信小程序進(jìn)行全局配置,決定頁面文件的路徑、窗口表現(xiàn)、設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間、設(shè)置多 tab 等
配置示例:
{ "pages": ["pages/index/index", "pages/logs/index"], "window": { "navigationBarTitleText": "Demo" }, "networkTimeout": { "request": 10000, "downloadFile": 10000 } }小程序 —— 頁面配置
每一個(gè)小程序頁面也可以使用 .json 文件來對本頁面的窗口表現(xiàn)進(jìn)行配置。
頁面的配置只能設(shè)置 app.json 中部分 window 配置項(xiàng)的內(nèi)容,頁面中配置項(xiàng)會覆蓋 app.json 的 window 中相同的配置項(xiàng)。
配置示例:
{ "navigationBarBackgroundColor": "#ffffff", "navigationBarTextStyle": "black", "navigationBarTitleText": "微信接口功能演示", "backgroundColor": "#eeeeee", "backgroundTextStyle": "light" }
同樣,在 cml項(xiàng)目里面,分為:
cml —— 項(xiàng)目配置chameleon.config.js 為項(xiàng)目的配置文件,你可以定制化構(gòu)建,比如是否帶hash,是否壓縮等等。
配置示例:
// 設(shè)置靜態(tài)資源的線上路徑 const publicPath = "http://www.static.chameleon.com/static"; // 設(shè)置api請求前綴 const apiPrefix = "https://api.chameleon.com"; // 合并配置 cml.config.merge({ wx: { build: {apiPrefix} }, alipay: { build: {apiPrefix} }, baidu: { build: {apiPrefix} }, web: { dev: { hot: true, console: true }, build: { publicPath: `${publicPath}/web`, apiPrefix } }, weex: { build: { publicPath: `${publicPath}/weex`, apiPrefix } } })cml —— 全局配置
cml 項(xiàng)目 app 目錄下的 app.cml 文件的 用來對 cml應(yīng)用 進(jìn)行全局配置,具有 跨端配置 和 差異化 的能力
配置示例:
cml —— 頁面/組件配置通過 usingComponents 配置 組件路徑 注冊引用的組件。
配置示例:
如何使用路由能力 小程序配置路由app.json 配置項(xiàng)列表的 pages 字段用于指定小程序由哪些頁面組成,每一項(xiàng)都對應(yīng)一個(gè)頁面的 路徑+文件名 信息。
數(shù)組的第一項(xiàng)代表小程序的初始頁面(首頁)。新增/減少頁面,需要對 pages 數(shù)組進(jìn)行修改。
如果項(xiàng)目有 pages/index/index.wxml、pages/logs/logs.wxml 兩個(gè)頁面,則需要在 app.json 中寫
{ "pages": ["pages/index/index", "pages/logs/logs"] }cml配置路由
src/router.config.json 是路由的配置文件,cml 內(nèi)置了一套各端統(tǒng)一的路由管理方式。相應(yīng)有 cml 路由配置映射如下:
{ "mode": "history", "domain": "https://www.chameleon.com", "routes":[ { "url": "/cml/h5/index", "path": "/pages/index/index", "mock": "index.php" }, { "url": "/cml/h5/logs", "path": "pages/logs/logs", "mock": "logs.php" } ] }
文件名不需要寫文件后綴,cml框架會自動去尋找對于位置的 .cml 文件進(jìn)行處理。
小程序使用路由打開新頁面:調(diào)用 API wx.navigateTo
頁面重定向:調(diào)用 API wx.redirectTo
頁面返回:調(diào)用 API wx.navigateBack
打開另一個(gè)小程序:調(diào)用 API wx.navigateToMiniProgram
返回到上一個(gè)小程序:調(diào)用 API wx.navigateBackMiniProgram
cml使用路由依據(jù)統(tǒng)一資源索引URI,自適應(yīng)打開不同環(huán)境同一路由PATH:
打開新頁面:調(diào)用 chameleon-api cml.navigateTo
頁面重定向:調(diào)用 chameleon-api cml.redirectTo
頁面返回:調(diào)用 chameleon-api cml.navigateBack
打開另一個(gè)跨端應(yīng)用:調(diào)用 chameleon-api cml.open
返回到上一個(gè)跨端應(yīng)用:調(diào)用 chameleon-api cml.close
如何注冊 如何注冊程序 小程序注冊程序在小程序項(xiàng)目里面,App() 函數(shù)用來注冊一個(gè)小程序。接受一個(gè) Object 參數(shù),其指定小程序的生命周期回調(diào)等。
示例代碼
App({ onLaunch(options) { // Do something initial when launch. }, globalData: "I am global data" })cml注冊程序
示例代碼
細(xì)心的你會發(fā)現(xiàn),
小程序中app.json app.js app.wxss和 src/app/app.cml的對應(yīng)關(guān)系如下
小程序 app.js | cml項(xiàng)目 src/app/app.cml |
---|---|
app.js | |
app.wxss | |
app.json |
在小程序項(xiàng)目里面,Page(Object) 函數(shù)用來注冊一個(gè)頁面。接受一個(gè) Object 類型參數(shù),其指定頁面的初始數(shù)據(jù)、生命周期回調(diào)、事件處理函數(shù)等。
示例代碼:
// index.js Page({ data: { text: "This is page data." }, changeText: function(e) { // sent data change to view this.setData({ text: "CML" }) } })cml注冊頁面
示例代碼
如何注冊組件 小程序注冊組件在小程序項(xiàng)目里面,
Component(Object) 構(gòu)造器可用于定義組件,調(diào)用 Component 構(gòu)造器時(shí)可以指定組件的屬性、數(shù)據(jù)、方法等。
示例代碼
Component({ properties: { myProperty: { // 屬性名 type: String, // 類型(必填) value: "" // 屬性初始值(可選) }, myProperty2: String // 簡化的定義方式 }, data: { text: "" }, // 私有數(shù)據(jù),可用于模板渲染 // 生命周期函數(shù),可以為函數(shù),或一個(gè)在methods段中定義的方法名 attached() { }, ready() { }, methods: { onMyButtonTap() { this.setData({ // 更新屬性和數(shù)據(jù)的方法與更新頁面數(shù)據(jù)的方法類似 text: "wx" }) } } })cml注冊組件
示例代碼
如何聲明生命周期統(tǒng)一各端應(yīng)用生命周期的定義,是跨端框架的重要組成,也是遷移的必經(jīng)之路。
小程序聲明生命周期可以在 App(Object)、Page(Object)、Component(Object) 傳入Object參數(shù),其指定小程序的生命周期回調(diào)等
代碼示例
// index.js Page({ onLoad(options) { // Do some initialize when page load. }, onReady() { // Do something when page ready. }, onShow() { // Do something when page show. }, onHide() { // Do something when page hide. }, onUnload() { // Do something when page close. }, onShareAppMessage() { // return custom share data when user share. } })cml聲明生命周期
在.cml 文件 代碼塊返回的對象實(shí)例,其指定生命周期回調(diào)
示例代碼
App 生命周期 映射小程序 app.js中的生命周期 -> cml src/app/app.cml
小程序 | chameleon |
---|---|
onLaunch | beforeCreate |
onShow | mounted |
onHide | destroyed |
小程序 Page()中的生命周期 -> cml src/pages/mypage/mypage.cml
小程序 | chameleon |
---|---|
onLoad | beforeCreate |
onShow | mounted |
onUnload | destroyed |
onReady | 生命周期多態(tài) |
onHide | 生命周期多態(tài) |
onShareAppMessage | 生命周期多態(tài) |
小程序 Component()中的生命周期 -> cml src/components/mycomponent/mycomponent.cml
小程序 | chameleon |
---|---|
created | created |
attached | beforeMount |
ready | mounted |
detached | destroyed |
每個(gè) cml 實(shí)例(App、Page、Component)在被創(chuàng)建時(shí)都要經(jīng)過一系列的初始化過程 ————
例如,需要設(shè)置數(shù)據(jù)監(jiān)聽、編譯模板、將實(shí)例掛載到 CML節(jié)點(diǎn) 并在數(shù)據(jù)變化時(shí)更新 CML節(jié)點(diǎn) 等。同時(shí)在這個(gè)過程中也會運(yùn)行一些叫做生命周期鉤子的函數(shù),這給開發(fā)者在不同階段添加自己的代碼的機(jī)會。
cml 為App、頁面Page、組件Component 提供了一系列生命周期事件,保障應(yīng)用有序執(zhí)行。
另外,如果你想使用某個(gè)端特定的生命周期,你可以從業(yè)務(wù)出發(fā)使用 生命周期多態(tài)。
數(shù)據(jù)如何響應(yīng)到視圖如今,雙向數(shù)據(jù)綁定&單向數(shù)據(jù)流 已深入開發(fā)者日常,MVMM開發(fā)模式算是框架標(biāo)配。
數(shù)據(jù)綁定、條件渲染、列表渲染 是如何書寫的呢?
示例代碼
小程序使用數(shù)據(jù)響應(yīng){{message}} WEBVIEW APP MINA {{item}}
// page.js Page({ data: { message: "Hello MINA!", view: "MINA", array: [1, 2, 3, 4, 5] }, onLoad() { this.setData({ message: "wx" }) } })cml使用數(shù)據(jù)響應(yīng)
數(shù)據(jù)響應(yīng)總結(jié){{message}} WEBVIEW APP MINA {{item}}
cml運(yùn)行時(shí)框架 提供了跨端響應(yīng)式數(shù)據(jù)綁定系統(tǒng)(Data binding),當(dāng)做數(shù)據(jù)修改的時(shí)候,只需要在邏輯層修改數(shù)據(jù),視圖層就會做相應(yīng)的更新。
只需要將 view<-->model 交互部分邏輯,作簡單遷移,便可使它成為跨多端的數(shù)據(jù)響應(yīng)系統(tǒng)。
事件交互cml 支持一些基礎(chǔ)的事件,保障各端效果(類型、綁定、事件對象)一致運(yùn)行。
示例代碼
小程序使用事件Click me!
// page.js Page({ tapName(event) { console.log(event) } })cml使用事件
事件使用總結(jié)Click me!
同時(shí),還支持自定義事件,用于父子組件之間的通信。
另外,如果你想要使用某個(gè)端特定的事件,cml 并不會限制你的自由發(fā)揮,你可以從業(yè)務(wù)出發(fā)使用 組件多態(tài) 或者 接口多態(tài) 差異化實(shí)現(xiàn)功能。
布局和外觀各端描述 布局和外觀 的層疊樣式表(CSS)實(shí)現(xiàn)存在差異,包括不限于 布局、盒模型、定位、文本。
所以, cml 框架內(nèi)置跨端一致性基礎(chǔ)樣式能力。
并且,定義了用于描述頁面的樣式規(guī)范CMSS(Chameleon Style Sheet)。
如何導(dǎo)入外部樣式使用 @import 語句可以導(dǎo)入外聯(lián)樣式表,@import 后跟需要導(dǎo)入的外聯(lián)樣式表的相對路徑,用 ; 表示語句結(jié)束。
小程序?qū)胪獠繕邮?/b>示例代碼:
/** common.wxss **/ .small-p { padding:5px; }
/** app.wxss **/ @import "common.wxss"; .middle-p { padding:15px; }cml導(dǎo)入外部樣式
詳細(xì)文檔
示例代碼:
/** common.css **/ .small-p { padding: 5px; }
樣式使用總結(jié)
同時(shí),為了統(tǒng)一多端尺寸單位,呈現(xiàn)效果一致,同時(shí)頁面響應(yīng)式布局,cml 項(xiàng)目統(tǒng)一采用 cpx 作為尺寸單位,規(guī)定以屏幕750px(占滿屏幕)視覺稿作為標(biāo)準(zhǔn)。
而且,各端樣式表擁有的能力 不盡相同,是項(xiàng)目遷移的主要陣地之一。
另外,如果你想要使用某個(gè)端特定的樣式能力,cml 并不會限制你的自由發(fā)揮,你可以從業(yè)務(wù)出發(fā)使用 樣式多態(tài)
注意:由于chameleon應(yīng)用是 跨多端web native 小程序框架,如果需要跨native,必須使用 flexbox 進(jìn)行樣式布局!!!
組件cml 項(xiàng)目一切皆組件。組件(Component)是視圖的基本組成單元。
框架為開發(fā)者提供了一系列基礎(chǔ)組件,開發(fā)者可以通過組合這些基礎(chǔ)組件進(jìn)行快速開發(fā)。
如:
view 基礎(chǔ)組件 text 基礎(chǔ)組件
同時(shí),cml 支持簡潔的組件化編程。
自定義組件開發(fā)者可以將頁面內(nèi)的功能模塊抽象成自定義組件,以便在不同的頁面中重復(fù)使用。自定義組件在使用時(shí)與基礎(chǔ)組件非常相似。
如何創(chuàng)建自定義組件代碼示例:
Component({ properties: { // 這里定義了innerText屬性,屬性值可以在組件使用時(shí)指定 innerText: { type: String, value: "default value", } }, data: { // 這里是一些組件內(nèi)部數(shù)據(jù) someData: {} }, methods: { // 這里是一個(gè)自定義方法 customMethod() {} } })
示例代碼
如何使用自定義組件使用已注冊的自定義組件前,首先要進(jìn)行引用聲明。此時(shí)需要提供每個(gè)自定義組件的標(biāo)簽名和對應(yīng)的自定義組件文件路徑。
代碼示例:
在 page.json 中進(jìn)行引用聲明
{ "usingComponents": { "component-tag-name": "path/to/the/custom/component" } }
在 page.wxml 中使用
代碼示例:
在 page.cml中進(jìn)行引用聲明
在 page.cml中使用
如何實(shí)現(xiàn)父子組件事件通信
事件系統(tǒng)是組件間通信的主要方式之一。自定義組件可以觸發(fā)任意的事件,引用組件的頁面可以監(jiān)聽這些事件。
代碼示例:
// 頁面 page.js Page({ methods: { onMyEvent(e) { console.log(e.detail) // 自定義組件觸發(fā)事件時(shí)提供的detail對象 } } })
// 組件 my-component.js Component({ methods: { onTap() { this.triggerEvent("customevent", {}) // 觸發(fā) 自定義組件事件 } } })
代碼示例:
組件使用總結(jié)
和小程序一樣,cml框架 提供了大量內(nèi)置組件和擴(kuò)展組件,抹平多端差異,便于開發(fā)者通過組合這些組件,創(chuàng)建出強(qiáng)大的應(yīng)用程序。
擴(kuò)展組件需要額外引入。如:
在執(zhí)行 cml build 構(gòu)建打包時(shí),cml 框架 會按需打包引用的內(nèi)置組件和擴(kuò)展組件,為代碼瘦身。
內(nèi)置組件和擴(kuò)展組件 都是支持跨多端的,對于一些沒有提供的某個(gè)端的組件,可以通過組件多態(tài)來實(shí)現(xiàn)。
如果希望使用小程序端的原生組件,那么可以在原生標(biāo)簽前加上 origin-*,cml框架會渲染原生組件參考
注意:origin-* 只能在灰度區(qū)文件中使用!!
如在 map.wx.cml 文件中使用原生地圖組件 :
如何調(diào)用平臺接口能力
在小程序里面,可以通過微信原生 API,調(diào)起如獲取用戶信息,本地存儲,支付功能等。
示例代碼
try { wx.setStorageSync("name", "Hanks") } catch (e) { console.error(e) }
同樣,在 cml 項(xiàng)目里面可以這樣調(diào)用:
示例代碼
import cml from "chameleon-api" cml.setStorage("name", "Hanks").then((res)=>{ console.log(res) },function(e){ console.error(e) })接口使用總結(jié)
cml 框架提供了豐富的多態(tài)接口,可以調(diào)起各端提供的原生能力,如系統(tǒng)信息、元素節(jié)點(diǎn)信息、動畫效果、本地存儲、網(wǎng)絡(luò)請求、地理位置等。請參考 API 文檔。
chameleon-api提供的接口都是支持跨多端的,對于一些沒有提供的某個(gè)端的原生接口,可以通過接口多態(tài)來調(diào)用。
遷移實(shí)例下面給出各端(vue、weex、小程序)遷移cml指南 以及 cml 導(dǎo)出組件到各端指南的具體遷移文檔:
如何遷移一個(gè)Vue項(xiàng)目到chameleon
如何遷移一個(gè)Weex項(xiàng)目到chameleon
如何遷移一個(gè)微信小程序到chameleon
普通項(xiàng)目使用chameleon跨端dialog組件
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109350.html
摘要:使用語法統(tǒng)一實(shí)現(xiàn)跨端組件請關(guān)注文章編寫跨端組件的正確姿勢下篇依靠強(qiáng)大的多態(tài)協(xié)議,項(xiàng)目中可以輕松使用各端的第三方組件封裝自己的跨端組件庫。這種做法同時(shí)解決了組件命名沖突問題,例如在微信小程序端引用表示調(diào)用小程序原生的組件而不是內(nèi)置的組件。 在chameleon項(xiàng)目中我們實(shí)現(xiàn)一個(gè)跨端組件一般有兩種思路:使用第三方組件封裝與基于chameleon語法統(tǒng)一實(shí)現(xiàn)。本篇是編寫chameleon跨端...
摘要:開局一張圖,故事全靠編是啥變色龍又是啥自從有小程序以來,小程序的第三方框架便孕育而生,從原始時(shí)代的只基于微信小程序多如今多端統(tǒng)一開發(fā)框架,可以說前端技術(shù)從年到年又發(fā)生了天翻地覆的變化。 Created 2019-4-6 21:57:17 by huqi Updated 2019-4-7 22:54:55 by huqi showImg(https://segmentfault.c...
摘要:基于對跨端工作的積累,規(guī)范了一套跨端標(biāo)準(zhǔn),稱之為協(xié)議開發(fā)者只需要按照標(biāo)準(zhǔn)擴(kuò)展流程,即可快速擴(kuò)展任意架構(gòu)模式的終端。實(shí)現(xiàn)了微信端的基本擴(kuò)展,用戶可以以此為模板進(jìn)行開發(fā)。新框架太多?學(xué)不動啦?有這一套跨端標(biāo)準(zhǔn),今后再也不用學(xué)習(xí)新框架了。各個(gè)小程序按自己喜好各自為政?有了這套標(biāo)準(zhǔn),再也不用重復(fù)開發(fā)各種新平臺啦。如今前端比較流行的 React Native、Weex、Flutter 等跨平臺開發(fā)框架...
摘要:但是從年微信推出小程序,到至今各大廠商都推出自己的小程序,跨端開發(fā)就不僅僅是技術(shù)的問題了。實(shí)現(xiàn)了微信端的基本擴(kuò)展,用戶可以以此為模板進(jìn)行開發(fā)。 新框架太多?學(xué)不動啦?有這一套跨端標(biāo)準(zhǔn),今后再也不用學(xué)習(xí)新框架了。 各個(gè)小程序按自己喜好各自為政?有了這套標(biāo)準(zhǔn),再也不用重復(fù)開發(fā)各種新平臺啦。 如今前端比較流行的 React Native、Weex、Flutter 等跨平臺開發(fā)框架,對于開發(fā)來...
摘要:在編寫跨端組件的正確姿勢上篇中,我們介紹了如何使用第三方庫封裝跨端組件,但是絕大多數(shù)組件并不需要那樣差異化實(shí)現(xiàn),絕大多數(shù)情況下我們推薦使用語法統(tǒng)一實(shí)現(xiàn)跨端組件。 在chameleon項(xiàng)目中我們實(shí)現(xiàn)一個(gè)跨端組件一般有兩種思路:使用第三方組件封裝與基于chameleon語法統(tǒng)一實(shí)現(xiàn)。在《編寫chameleon跨端組件的正確姿勢(上篇)》中, 我們介紹了如何使用第三方庫封裝跨端組件,但是絕大...
閱讀 3485·2021-09-02 09:53
閱讀 1805·2021-08-26 14:13
閱讀 2767·2019-08-30 15:44
閱讀 1328·2019-08-30 14:03
閱讀 1978·2019-08-26 13:42
閱讀 3026·2019-08-26 12:21
閱讀 1315·2019-08-26 11:54
閱讀 1909·2019-08-26 10:46