小程式的一點實踐

来源:https://www.cnblogs.com/cnyball/archive/2018/08/15/9482628.html
-Advertisement-
Play Games

經過測試,鬧心律師小程式第二期也即將上線了,而鬧心對於小程式有怎麼樣的開發實踐呢? 小程式在千呼萬喚出來之後,帶來了大量的開發的吐槽,但儘管我們再怎麼嫌棄小程式語法,我們也無法否認微信給小程式所帶來的流量以及收益,也必須看重小程式,也不得不去學習小程式 那麼我們開發小程式應該怎麼去開發呢,熟悉前端的 ...


經過測試,鬧心律師小程式第二期也即將上線了,而鬧心對於小程式有怎麼樣的開發實踐呢?

小程式在千呼萬喚出來之後,帶來了大量的開發的吐槽,但儘管我們再怎麼嫌棄小程式語法,我們也無法否認微信給小程式所帶來的流量以及收益,也必須看重小程式,也不得不去學習小程式

那麼我們開發小程式應該怎麼去開發呢,熟悉前端的我們開發起有小程式有什麼困難嗎?

困難不至於,圍繞小程式的官方文檔甚至是可以輕鬆的開發,就是開發的體驗的麻煩倒是不少

首先來看看小程式的架構

初始化一個預設配置的小程式項目

app.json 裡面定義小程式的路由,以及全局的一些配置

app.js 進行註冊程式 小程式的生命周期以及監聽整體小程式的活動

page(路由頁)以及 component(組件) 頁 都由

  1. .json 單獨的頁面配置 可以覆蓋全局配置
  2. .js 定義方法以及屬性 有完整的頁面/組件的生命周期
  3. .wxml wxml 有自己的作用域 除了引入 wxs 其他只接受 js 中從 data 傳遞過來的值
  4. .wxss 算是 css 的弱化版

我們可以打開小程式的開發工具,查看控制台的 Sources 選項,點擊裡面的文件詳情可以很清楚的看懂,小程式是由 webpack 打包的
並且隨機的監聽了本地的一個空閑埠

小程式視圖層使用 webview 渲染,邏輯層使用 JSCore,通過 JSBridage 進行通信 邏輯層改變數據後通知視圖層觸發視圖層的局部更新,並且在載入頁面的時候預先載入多一個 webview 用於渲染下一次的路由

總的來說,小程式提供了自己的一套標簽並提供 Native 方法,並且禁用了 Dom API,只能使用 setData 去更新視圖,另外值得一提的是小程式把 Function 重寫了,
而小程式已經把大部分都處理好了,剩下的只需要寫好我們的業務就可以了,

在我寫小程式來說,還是很順暢的,那麼感覺到的麻煩是什麼呢?

  1. 配置繁鎖,事件命名規則不一,生命周期名字不一,且概念駁雜
  2. .wxss 僅支持部分 CSS 選擇器 我們平時都是使用 less, sass 等預處理語言,在這裡回到寫原生 css 沒有很大的意義
  3. wxml 不支持使用直接使用 js 方法,即是無法通過 js 使用過濾器等
  4. 觸發函數傳遞參數 只能通過 data-xxx 的方式來傳遞,並通過 event 的來拿到我們綁定的參數

鬧心律師小程式的文件 dist 目錄

├── app.js
├── app.json
├── app.wxss
├── pages    // 目錄
├── models   // 狀態數據管理
│    │── store.js   // 導入 index 並且註冊導出 store 實例
│    │── index.js   // 導入各個模塊 統一導出
│    │── pay.js    // 支付模塊
│    ├── im.js     // 聊天IM模塊
│    ├── order.js  // 訂單模塊
│    └── ...略     // 各個頁面或者組件的狀態
├── libs
│    │── WebIM.js  // 環信聊天的 sdk
├── utils
│    │── Base64.js   // 處理一些加密解密
│    ├── cnyUtils.js // 一些工具類
│    ├── md5.js      // md5 加密
│    ├── moment.js   // 處理時間的一些函數
│    └── index.js     // 綜合導出工具類
│
├── static // 一些靜態的圖片資源
├── helper // 一些純業務狀態以及一個 util.wxs 作為狀態過濾器文件
├── template // 一些純展示的組件
├── components // 純組件
├── container  // 有狀態組件
├── request  // 封裝 wx 的 request 並返回 Promise
├── service  // 導入 request 並導出每個封裝好介面地址的請求函數

制定開發規範

雖然現在只是我一個人在擼小程式,但是一個項目的開發規範還是必不可少的,控制命名以及代碼風格,採用 eslint,命名使用駝峰式

寫新方法方法必須使用 JSDoc 進行註釋和類型

css 隔離,通過公共 import 導入,組件開頭必須大寫

git 分為主分支,測試分支,開發分支,以及 bug 分支

使用 webpack 進行編譯打包,分離開發環境以及生產環境,再進行小程式的上傳打包

關於開發組件的體驗

目前小程式的組件的體驗對於開發者來說還是很差的,它必須先在 json 配置里必須先定義是組件即 'component':true
一個組件的 .js 文件 大概的屬性如下

Component({
  externalClasses: ['my-class'] //接收外部的class
  behaviors: [], //mixin 復用函數屬性
  options: { //也許你需要?
    multipleSlots: true // 在組件定義時的選項中啟用多slot支持
  },
  properties: {
    //相當於React的propTypes + defaultProps
    string: {
      type: String,
      value: 'default value',
      observer:function(){} //監聽string的改變 改變後觸發
    },
    number:Number //也可以直接聲明類型即可
  },
  data: {}, //  相當於React的state
  created() {}, //組件即將掛載
  attached() {}, //組件掛載完成
  detached() {}, //即將卸載
  relations:{ //組件的通信很麻煩,  必須預先定義
    'parentName':{
      type: 'parent', // 關聯的節點是父節點
      // ...略方法
    }
    'childName':{
      type: 'child', // 關聯的節點是子節點
      // ...略方法
    }
  }
  methods: {},//放事件回調及其他方法
});

可以看到一個組件的生命周期其實和 page 是不一樣的命名,這就令人噁心了

properties 是不可以傳遞函數的,data 以及 properties 是共通的數據,無論你訪問哪一個都能夠獲取兩個對象的數據

組件的樣式是限定自己的作用域的,不能夠直接從 app.wxss 中繼承

事件的通信是 eventbus 的方式 使用 wx 的 triggerEvent 方法來進行通知

雖然不能夠傳遞函數給組件,我們卻可以在父頁面可以使用 selectComponent 來選擇子組件實例,

並且通過子組件的實例可以使用子組件的方法 進行控制反轉 回調函數作為參數傳遞過去併進行深層傳遞迴調

我們自己跑測試一個 component 的例子,打開控制台查看 wxml 可以看到渲染的組件 有一個#shadow-root 就知道小程式的組件是基於 Web Component

有興趣的可以去看看 MDN 看看

狀態管理

那麼複雜點的業務必不可少的就是數據與頁面的解耦以及多層傳值通信問題,那麼小程式的狀態管理是可以定義在 app 中,在 page 或者 component 中使用 getApp()獲取小程式實例,調用 app.js 里定義的方法或者屬性

那麼需要頁面之間共用的屬性以及方法, 我們也不可能全部定義在 app.js 中

在鬧心律師小程式我是在 models 文件夾中管理狀態,寫了一個 wenaox 進行狀態管理,通過 npm 安裝,構建 npm 後就可以使用 import 全局導入了

通過多 contro 進行管理 註冊 store 實例。

在 app.js 導入 store 實例,使用 Provider 註入後

即可在 page 使用 orm 註入所需要的方法和屬性

在 component 則使用 ormComp 方法註入

性能優化

減少 setData 的次數以及一次更新的數據量,在這裡 wenaox 是在 page 頁隱藏以及卸載的時候均取消監聽避免後臺占用資源

關於其他的性能優化,都是通用的,減少請求,圖片大小,懶載入,壓縮等等

運維

日誌/監控/分析上報系統

目前採用的是小程式自帶的數據分析以及上報預警功能,小程式目前可以建立 128 個監控事件,

而日誌上報也是自由定義需要記錄的操作日誌,5M 作為上限 超過 5M 廢棄舊的,然後可以通過設置 Button 組件 的 open-type 為 feedback 來讓用戶上傳日誌。

小程式新版本上線

通過 getUpdateManager 方法,獲取新的版本信息,提示用戶更新。

總結

在開發小程式的過程中,可能會因為很多限制因素,而導致開發體驗並不是非常友好
但小程式自身提供了開發工具,預設的打包,以及各種 Native 方法

到這裡我們也可以很清楚的看到鬧心律師小程式基本上是無需很多的其他配置或者插件就可以順利的開發,
一句話,看著文檔擼起來,輕鬆搞定業務。

小程式雖然是 程式,現在也越來越"龐大"了起來

我期待小程式的生態的生長,也在觀望各種轉編譯成小程式的框架

目前鬧心律師還是處於使用原生開發的狀態,如果有更多的實踐,我會詳細分享給大家


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 編譯環境是Ubuntu12.04。手機nexus 5,編譯安卓6.0.1源碼並燒錄到真機。 源碼用的是科大的鏡像:http://mirrors.ustc.edu.cn/aosp-monthly/,下載完之後會有一個aosp-latest.tar文件,然後新建一個倉庫,把它解壓到你的倉庫里。這裡下載會 ...
  • 1、全面屏支持,Android P加入了對劉海屏的支持,谷歌稱之為凹口屏幕(display with a cutout)。藉助最新的提供的DisplayCutout類,開發者可以找到非功能區域的位置和形狀,而非功能區域是不應顯示功能的;使用getDisplayCutout()就可以獲取這個區域的詳細 ...
  • 雖然 Android 9.0 都已經面世了,本篇文章寫的有點遲了。 但是遲到好過不到,因此基於此這邊還是記錄一下項目中遇到的 Android 8.0 的坑及對應解決方法。 每次系統升級,雖然系統功能更加強大了,各方面性能也提高了。 但是對於開發者而言,一個困擾的問題也是隨之而來——相容。 尤其對於一 ...
  • SurfaceView Surface相當於繪製的容器,所有View和子類都是繪製在這裡面。 SurfaceView是View的子類,將Surface的數據顯示出來。 View適用主動更新視圖,不需要頻繁刷新。在主線程更新UI,沒有雙緩衝機制。 SurfaceView適用於被動更新視圖,頻繁刷新。通 ...
  • Google Play 不能直接下載apk安裝包,解決辦法,安裝插件下載 第一步 FQ就不說了 第二步 安裝google瀏覽器 APK Downloader插件 第三步 打開Google play網站,找到要下載的APP,點擊進入詳情頁面。點擊插件,複製鏈接進去,即可下載apk安裝包 ...
  • 區別:null是一個表示無的對象,轉換為數值為0; undefined表示一個無的原始值,轉化為數值為NAN(與任何數字相加也為NAN) undefined出現原因:(口訣:一變數二函數一對象) 1.變數被聲明瞭但是沒賦值時 2.調用函數時,應該提供的參數沒提供,則該參數為undefined 3.函 ...
  • 1 . Math.ceil() 向上取整 2. Math.floor() 向下取整 3. Math.round() 四捨五入取整 4. Math.random() 生成隨機數 生成n - m 的隨機整數 parseInt(n + Math.random()*(m-n+1)); parseInt是強制 ...
  • 經過 "《字元串的擴展》" 和 "《字元編碼的那些事》" 這兩篇文章的閱讀,大概瞭解js里codePointAt方法返回結果的含義。 那麼這個134071到底是這麼來的呢?我們可以根據這段話來理解。 在http://tool.chinaz.com/tools/unicode.aspx這個網站上可以將 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...