<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          基于Webpack4.X,小程序工程化落地實踐

          seo達人

          小程序開發現狀:

          1. 開發工具不好使用(無法熱更新,編譯緩慢);
          2. 無法使用css預處理語言(Sass、Less),有些IDE的插件可以監聽編譯,但不同編輯器需要額外安裝;
          3. 無法使用工程化(圖片自動壓縮,文件監聽編譯等);
          4. 編碼繁瑣(創建一個頁面,需要新建4個文件(.wxml、.js、.json、.wxss),每次新建都需要新建4次或者復制文件比較浪費時間);
          5. 團隊多人協作,代碼風格、使用的編輯器不一致;

          技術選型:

          在進行小程序項目啟動,進行技術選型的時候,對市場上多個小程序框架進行了考慮:

          • uni-app、mpVue、wepy、taro、 kbone

          團隊成員mpvue、wepy、uni-app都有實際的項目經驗,且根據Github上的star數還有issue,最后決定回到到使用原生開發。

          原因:

          雖然框架有些很成熟,有工程化和跨端的解決方案,也有實際的上線項目,但考慮到后續一些支撐性的問題(維護,文檔,坑等),在github上看了issue,有些已經沒在維護了。

          想著讓項目持續迭代,不受第三方框架限制,保持穩健,最后決定使用原生,跟著官方的迭代升級,自己維護,引入前端工程化的思想,提高繁瑣的流程以及開發效率。

          引入工程化

          1. 基于Webpack4.x,自定義Webpack配置

            • scss編譯為wxss:定義全局變量,使用公共的樣式文件,提高css開發效率和可維護性;

            • 自動壓縮圖片資源 : 小程序對包大小有限制,壓縮圖片大小可以減少空間,加快頁面加載;普通的圖片壓縮需要將圖片上傳到在線圖片壓縮網站,壓縮完再保存下來,效率比較低。現在執行命令就可以自動壓縮圖片。

          2. 代碼規范

            • eslint: 能在js運行前就識別一些基礎的語法錯誤,減少不必要的小問題,提高調試效率;

            • husky、line-staged、prettier: 統一團隊代碼規范: 當執行代碼提交到git倉庫時,會將已改動文件的代碼格式化統一規范的代碼風格;

          1. 命令行創建頁面和組件模板

            • 小程序每次新建頁面或者組件,需要依賴4個文件(.wxml,.js,.wxss,.json)。只需要執行npm run create命令,會提示選擇創建頁面還是組件,選擇完成輸入頁面或者組件的名字,會自動生成4個模板文件(.wxml,.js,json,.scss)到對應的目錄

          1. 引入jest單元測試

            • 生成測試覆蓋率

          項目結構

          app -> 小程序程序的入口,使用微信開發者工具制定app目錄cli -> 生pagescomponents的模板腳手架img ->

           圖片資源原文件.eslintignore.eslintrc.js.gitignore(忽略wxss的提交,多人和做改動,容易有沖突,將scss文件傳到服務器就好了).prettierrc.js(代碼格式化風格配置)babel.config.jsjest.config.js(單元測試配置文件)webpack.compress.js(指定入口圖片資源文件,將圖片壓縮編譯到小程序的資源目錄)webpack.config.js -> (工程化入口文件,指定入口scss文件,監聽文件變化,自動將scss編譯為wxss)

          項目使用的包文件

          • webpack、babel、eslint: 轉換、規范js
          • chalk: console.log打印彩色顏色
          • scss、css-loader: 編譯scss
          • figlet: 控制臺顯示字體樣式
          • husky,line-staged,prettier: 代碼格式化相關
          • jest、miniprogram-simulate: 單元測試

          項目運行

          . 安裝依賴    npm install 或 yarn install. 編譯scss   

           npm run dev. 壓縮圖片    npm run img. 單元測試    npm run test(生成測試報告)    npm run test:watch(監聽測試文件改動—開發環境下使用)

          示例

          編譯scss

          執行 npm run dev

          壓縮圖片

          執行 npm run img

          將圖片壓縮到app/assets/img目錄下,一張7k的圖片變成5k,肉眼看不出有什么差別。

          新建頁面

          執行 npm run create

          終端會提示選擇頁面還是組件,選擇頁面,按Enter鍵,輸入頁面的名稱,會自動將4個文件創建到app/pages/xxx下。

          新建組件

          執行 npm run create

          終端會提示選擇頁面還是組件,選擇組件,按Enter鍵,輸入組件的名稱,會自動將4個文件創建到app/components/xxx下。

          單元測試

          執行 npm run test 生成測試報告執行 npm run test:watch 監聽測試文件,方便開發使用

          其他思考

          工程化的初衷就是為了減少重復性的操作,提高編碼的效率和樂趣。

          JavaScript是弱類型語言,好處是靈活,壞處是太靈活(多人協作,維護別人寫的代碼就是很痛苦了)。

          項目最主要的是穩健,可高度自定義拓展,不拘束于版本和地上那方,特別多人協作的團隊,工程化能給團隊帶來更多的收益,后續也會考慮將TypeScript等其他好的方案引入項目。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          uni-app頁面之間的傳參,讓下一個頁面接收上一個頁面的值

          seo達人

          為了實現頁面之間的通訊,或者數據交換,我們要實現一個頁面到另一個頁面的傳參,可以通過點擊跳轉的時候進行頁面之間的傳值。


          <template>

             <view>

                 <navigator url="../a/a?id=1" hover-class="none">

                     <view>跳轉到A頁面</view>

                 </navigator>

                 <navigator url="../b/b?id=2" hover-class="none">

                     <view>跳轉到B頁面</view>

                 </navigator>

                 <navigator url="../c/c?id=3" hover-class="none">

                     <view>跳轉到C頁面</view>

                 </navigator>

             </view>

          </template>


          <script>

          export default {

             data() {

                 return {


                 }

             },

             methods: {


             },

             onLoad: function (option) {

                 //獲得上一個頁面傳過來的id

                 var pageid = option.id;

                 console.log(pageid);

             }

          }

          </script>

          Author:TANKING

          Web:http://www.likeyun.cn/

          Date:2020-8-13

          WeChat:face6009

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          如何實現小程序用戶增長,開發者給了幾點關鍵建議

          seo達人

          目前除了微信小程序,還有支付寶小程序,百度小程序,字節跳動小程序、京東小程序等,各大流量平臺都希望借助小程序的服務連接能力,為企業和用戶提供更好的服務。企業在小程序賽道上的戰略布局,可以借助平臺的流量,獲得更多的用戶和變現。

          有些人會認為小程序用戶增長是運營的事情,與產品和開發無關,實則不然。對于全棧工程師來說,他們不僅能做好小程序,還能玩溜小程序,真正全方位、無死角實現用戶增長最大化。

          小曉云近期采訪了幾位開發者,他們的小程序有些已經突破百萬用戶,在自己的領域中獲得持續性的發展。開發者圍繞用戶增長中的拉新、留存、轉化等維度,為我們提供了關于產品設計和開發的建議,希望以下的經驗對你們都有幫助。

          分享 1:小程序視覺和交互是重點,可以借鑒同行讓產品更符合大眾需求

          小程序的特點是「即搜即用,用完即走」,更適合那些輕量級的工具型應用。用戶來得快去得也快,則更需要簡潔、輕便的設計定位。UI 設計師和前端開發者平??梢酝ㄟ^知曉商店等小程序商店,多參考同類型優秀小程序的設計與交付,以此優化自己的小程序。雖然小程序視覺和交互并不會帶來用戶裂變式增長,但這個是留住用戶最基本的要求了。

          分享 2:微信小程序訂閱消息是一個用戶回流的神器

          今年微信小程序從模板消息升級為訂閱消息,這是一個幫助小程序實現用戶回流重要能力了。對于開發者來說,重點思考:如何合理的向用戶直觀傳達訂閱消息、在何處彈出訂閱消息。開發者在接入訂閱消息能力時,應該選擇適合業務場景的模板,并進行文案的引導,同時可以嘗試,發起一次訂閱時同時訂閱多個模版,讓用戶一次性獲得更多消息,提高訂閱率。新用戶粘性較低,可以借助訂閱消息發送獎勵通知等,召回用戶。

          分享 3:結合業務和用戶特點,策劃符合平臺調性的活動

          我們原先是做體育領域的資訊和商城 App,微信小程序發布后,龐大的微信流量給了我們一個拓展用戶的新機會,于是在 2017 年與知曉云結緣,并相伴 3 年了。用戶增長其實不是簡單的一兩句話可以總結,所以我先分享其中一點。體育領域的資訊,能吸引和留住用戶的,主要靠資訊的時效性、賽事活動、體育明星的加持,因此我們曾組織體育明星的投票活動,粉絲樂于參與,同時也提高了認同感和優越感。投票功能設置的門檻很低,但我們增加了很多排行榜的文案引導,加強粉絲的緊迫感,同時也增加了很多分享文案引導,讓粉絲主動分享。這個是針對體育領域上很成功的增長案例,當然也可以應用于其它追星平臺等。

          分享 4:做好數據分析,讓數據驅動用戶增長

          精細化運營的核心就是數據驅動,明確關鍵指標,并且通過數據分析的方式進行評估,然后不斷優化。數據埋點的缺點是開發成本高,所以我們是基于無埋點,一次性集成 SDK,采集頁面訪問、點擊行為、用戶特征等全量數據。

          分享 5:研究小程序平臺的用戶喜好,提供他們想要的服務

          我是做 QQ 小程序的, QQ 小程序的用戶對于社交、戀愛等偏娛樂的場景更感興趣,針對性提供頭像制作、起網名、小游戲等服務有比較大的市場。所以可以結合平臺用戶的特點和喜好,開發相關服務的小程序,更有利于小程序的發展和變現。

          以上內容均來自知曉云開發者的經驗分享,如果你對哪一個內容感興趣,可以在文末或者小曉云微信上留言,對于大家感興趣的內容,我們將再次邀請開發者進行更全面更完整的分享。

          知曉云成立三年以來,通過提供不斷更新的開發工具,幫助開發者提高開發效率,輕松完成優秀的作品。但我們服務不止于快、省,還要在增長與變現上賦能開發者/企業。

          知曉推送

          在線可視化操作加上業務系統輕松集成,可以一鍵推送全平臺的訂閱消息推送服務,輕松觸達億萬用戶。

          實時數據庫

          支持各類高實時性的業務場景,以簡便的開發方式、更高的時效性實現在云端和客戶端來的數據實時同步。通過實時數據庫實現的即時聊天室、投票、直播間送禮和彈幕、小游戲等互動功能,提升用戶留存和轉化。

          運營后臺

          一鍵生成可視化的運營管理后臺,User Dash API 和開箱即用的前端組件庫,開發者可以快速編寫一套獨立的運營后臺,并支持一鍵部署至知曉云服務器,是開發者的利器,也是運營者的福音。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          模板商終結者——微信小商店

          seo達人

          微信小商店已經正式上線,對企業、個體和個人三種開店類型全量開放。微信小商店可以幫助商家免開發、零成本、一鍵生成賣貨小程序。微信小商店團隊將負責商品發布、訂單管理、交易結算、物流售后、直播帶貨等技術和服務流程。

          微信小商店個人開店非常簡單,3秒搞定,毫不夸張,堪稱模板商終結者。個人開店僅需身份認證即可,綁定銀行卡可以提現,1個微信號僅支持開通1個個人主體的小商店。

          企業、個體工商戶需要上傳營業執照、經營者信息、結算銀行賬戶信息等基礎信息,1個微信號可以開通3個“企業和個體”主體的小商店。

          當前微信小商店現階段支持售賣的商品類目超過1500個,主要包括:寵物生活、家用電器、手機、通訊、數碼、電腦、辦公、服飾內衣等,后續可售品類會增多。

          如何開店

          1. 只需搜索小程序 小商店助手
          2. 進入后只需填入店名等極少量信息,選擇個人店鋪的話不需要上傳資質
          3. 點擊確認就能極速擁有自己的小程序店鋪啦!
          4. 麻麻再也不用擔心我被模板商折磨啦!

          小程序助手

          在 小商店助手 里面還能查看店鋪數據在售商品、新增商品待付款商品、訂單管理客服管理、店鋪設置 等,功能非常強大!

          小程序助手

          小程序助手

          小程序助手

          小程序助手

          上架新商品也是非常簡單快捷,直接上傳商品圖片,加上標題和一些描述信息就可以。

          而且不論是開店審核還是商品上架審核,都非常迅速,作者嘗試了幾次都在一分鐘左右就審核完了!

          需要注意的一點是微信會收 0.6% 的交易金額提成哦,畢竟此路他開此樹他栽樹嘛~

          小程序助手

          小程序助手藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          微信小程序發送訂閱消息(之前是模板消息)

          seo達人

          之前的模板消息已經廢棄,現在改為訂閱消息,訂閱消息發布前,需要用戶確認后才能接收訂閱消息。


          image


          小程序端

          index.wxml


          <button bindtap="send">發送訂閱消息</button>

          index.js


          const app = getApp()

          Page({ data: {

           }, send:function(){

             wx.requestSubscribeMessage({ tmplIds: ['WZiCliW1zVtHXqX7dGnFNmFvxhW-wd9S_W4WfrwNvss'],


          success:(res)=> { // 在登錄的時候,獲取到的openid進行緩存,現在直接把openid提取出來即可 wx.getStorage({ key: 'openid',


                   success (res) { console.log(res.data)

                     wx.request({ url: 'https://www.xxx.com/send.php?openid='+res.data, data: {},


          header: { 'content-type': 'application/json' },


                       success (res) { // 推送 if(res.data.errcode == '43101'){ console.log("拒絕訂閱消息")

                         }else if(res.data.errcode == '0'){ console.log("發送訂閱消息")

                         }else{ console.log("未知錯誤")

                         }

                       }

                     })

                   },

                   fail (res) { console.log("沒有openid,無法發送")

                   }

                 })

               }

             })

           }

          })

          后端

          <?php //設置 header  header("Content-type:application/json"); //接收參數 $openid = $_GET["openid"];


          //初始化 CURL $ch = curl_init(); // 獲取access_token // include ''; require_once("access_token.php");


          //目標服務器地址  curl_setopt($ch, CURLOPT_URL,


          'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token='.$access_token);


          //設置要POST的數據 curl_setopt($ch, CURLOPT_POST, true);


          $data = '{

           "touser": "'.$openid.'",

           "template_id": "模板ID",

           "page": "pages/index/index",// 要跳轉的頁面

           "lang":"zh_CN",

           "data": {

               "thing4": {

                   "value": "歡迎使用專插本最前線小程序"

               },

               "thing5": {

                   "value": "小程序由公眾號:廣東專插本最前線開發"

               }

           }

          }';

          curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

          curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // 對認證證書來源的檢查 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 從證書中檢查SSL加密算法是否存在 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //獲取的信息以文件流的形式返回,而不是直接輸出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //發起請求 $result = curl_exec($ch); echo $result; //關閉請求 curl_close($ch); ?>

          access_token.php


          <?php // 聲明頁面header header("Content-type:charset=utf-8"); // APPID、APPSECRET $appid = "你的小程序APPID";

          $appsecret = "你的小程序APPSECRET"; // 獲取access_token和jsapi_ticket function getToken(){

             $file = file_get_contents("access_token.json",true);//讀取access_token.json里面的數據 $result = json_decode($file,true); //判斷access_token是否在有效期內,如果在有效期則獲取緩存的access_token //如果過期了則請求接口生成新的access_token并且緩存access_token.json if (time() > $result['expires']){

                 $data = array();

                 $data['access_token'] = getNewToken();

                 $data['expires'] = time()+7000;

                 $jsonStr =  json_encode($data);

                 $fp = fopen("access_token.json", "w");

                 fwrite($fp, $jsonStr);

                 fclose($fp); return $data['access_token'];

             }else{ return $result['access_token'];

             }

          } //獲取新的access_token function getNewToken($appid,$appsecret){ global $appid; global $appsecret;

             $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret."";

             $access_token_Arr =  file_get_contents($url);

             $token_jsonarr = json_decode($access_token_Arr, true); return $token_jsonarr["access_token"];

          }


          $access_token = getToken(); ?>

          邏輯

          1、通過button控件出發send函數

          2、send函數調用wx.requestSubscribeMessageAPI,微信允許接收訂閱消息

          3、 wx.request向send.php后端請求

          4、后端獲取access_token后,調用訂閱消息接口POST一段json數據即可發送訂閱消息


          官方文檔

          1、https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html


          2、https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html


          Author:TANKING

          Date:2020-08-24

          Web:http://www.likeyun.cn/

          WeChat:face6009

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          Flutter 實戰:增刪查改功能示例代碼

          seo達人

          七月,我們上線重磅基礎能力——實時數據庫,并開了實戰直播課,讓大家可以更好的理解并使用該服務。你的聊天室、站內信、投票、小游戲等需要高實時的功能正在想你招手,趕緊使用實時數據庫服務又快又簡單的開發它們吧。


          點擊此處回顧教學視頻,看看知曉云大前端組長如何在十分鐘內搞定一個視頻彈幕微信小程序。


          Ps:目前實時數據庫限時免費,就算以后收費,費用也是低到忽略不計。速速用上,不要錯過這么硬核的能力。


          八月,我們迎來知曉云三周年,推出各式各樣的福利活動。開發者在這個全年最優惠的時間里,升級、續費,甚至購買三年期包年套餐,與知曉云鎖定下一個三年。非常感謝大家的支持,我們會繼續努力,不斷輸出更強大的能力。


          九月初,Flutter SDK 已進入測試階段,很快就可以跟大家見面了。

          Flutter SDK 的使用比較簡明易懂,例如對數據表的增刪查改,在指定數據表后,對數據項進行對應操作即可,例如新增(create)、查找(get)、修改(update)和刪除(delete)。


          以下是對 Flutter 增刪查改功能進行展示:


          TableObject product = new TableObject('product'); // 獲取名為 product 的數據表


          // 新增數據

          TableRecord record = product.create(); // 創建一條空白記錄


          // 為屬性字段賦值

          record.set('name', '知曉云 flutter sdk'); // 對 name 字段進行賦值

          record.set('version', '1.0'); // 對 version 字段進行賦值


          // 將數據保存到服務器

          record = await record.save(); // 保存


          // 從服務器獲取一條數據

          TableRecord record = await product.get(record.id);


          // 更新數據

          record.set('version', '1.1');

          await record.update();


          // 刪除數據

          await product.delete(recordId: record.id);

          目前知曉云 Flutter SDK 支持的功能如下:


          數據表

          用戶

          內容庫

          文件

          云函數調用

          獲取服務器時間

          本地存儲

          Flutter SDK 正式上線后,我們還會輸出實戰教學視頻,敬請期待!


          另外,我們提前開啟內測申請通道,點擊此處或微信掃一掃掃描下方卡片二維碼即可申請,獲得內測資格的開發者,不僅可優先體驗新功能,同時還可以與知曉云工程師近距離交流,你使用后的建議也可以得到更快的反饋與實現。


          知曉云 Flutter SDK


          2020 年已過去三分之二,好消息是,即將到來的中秋&國慶小長假以及知曉云近期的更新內容,除了即將上線的 Flutter SDK ,還有以下更新。


          1. 支持 QQ 小程序訂閱消息,消息能力又前進一步。

          與微信訂閱消息不同在于,QQ 小程序訂閱消息不僅支持分為「一次性訂閱」,還支持「長期訂閱」,如果用戶之前已經同意授權長期訂閱,則不會再出現彈窗詢問。>>> 查看開發文檔


          2. iOS 和 Android SDK 支持微博登錄。


          查看 iOS 開發文檔

          查看 Android 開發文檔

          如果你有其他需求,可以通過文末

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          uni-app提交表單到后端,接收表單數據

          seo達人

          要想接收表單數據,首先要在表單進行數據的綁定,我們可以使用v-model="keyword"進行綁定。


          然后在js獲取這個綁定的值。


          index.vue


          <template>

          <view>

             <view class="search-con">

                     <view class="form-con">

                     <form class="search-form">

                         <input type="text" v-model="keyword" @tap="showsearchbtn" focus="true"/>

                         <button form-type="submit" hover-class='none' @tap="keyword">提交</button>  

                     </form>

                     </view>

             </view>

          </view>

          <template>

          js


          <script>

          export default {

             data() {

                 return {


                     }

                 },

                 methods: {

                     keyword(e){

                         // 獲取表單值

                         let kw = this.keyword;

                         console.log(kw);

                     }

                 }

             }

          </script>

          Author:TANKING

          Web:http://www.likeyun.cn

          Date:2020-8-13

          WeChat:face6009

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          滴滴出行小程序I18n最佳實踐

          seo達人

          背景

          I18n = Internationalization,國際化,因為單詞由首末字符i/n和中間18個字母組成,簡稱i18n。對程序來說,就是要在不修改內部代碼的情況下,能根據不同語言及地區顯示相應的界面,以支持不同語言的人順利使用程序。

          業務背景

          互聯網行業進入下半場,精細化運營是關鍵。多語言支持能讓產品更好地服務境內的其他語言用戶,也為產品出海打下基礎,隨著 WeChat/Alipay 的全球化,你的小程序是否做好準備了呢?

          4月初,滴滴出行小程序團隊接到支持英文版的需求,預計上線時間為6月上旬。當前滴滴出行小程序集成的眾多業務線和各種公共庫,展示給用戶的有前端硬編碼的靜態文本和服務端下發的文案,都要同步接入多語言。考慮到小程序當前的體量,光文本收集、語料翻譯、npm package 支持,聯調,測試,溝通成本等等,并且前端開發只投入1.5人力的情況下,時間是蠻緊迫的,但是我們抗住了壓力,最終英文版滴滴出行小程序如期上線,截止目前運行穩定,用戶反饋良好,得到了超出預期的收益。

          當然這一切得益于各團隊同學的工作,和各團隊的通力配合,更得益于部門技術團隊 Mpx框架優雅的多語言能力支持。劃重點來咯,所謂工欲善其事必先利其器,如果你的公司業務需要開發小程序,也需要接入多語言,那么請搬好小板凳,我們來看一下小程序框架 Mpx 是如何優雅支持多語言能力。相信看完這篇,可以幫助你認識 Mpx(https://github.com/didi/mpx) ,加深對框架的理解,最終利用 Mpx 框架迭代小程序,年終獎多出那部分可以打賞一下作者,買杯咖啡哈(偷笑.jpg)

          以下是滴滴出行小程序的中英文版本對比:

          滴滴出行微信小程序i18n

          也歡迎大家在微信/支付寶里搜索滴滴出行小程序,實際使用感受下。PS:切換語言的方法是,打開小程序,點擊左上角用戶頭像,進入側邊欄設置頁面,點擊切換中英文即可體驗。

          技術背景

          在上述業務背景下,Mpx 框架——滴滴自研的專注提升小程序開發體驗的增強型小程序框架,內建 i18n 能力便提上日程。

          與 WEB 不同,小程序(本文以微信小程序為例)運行環境采用雙線程架構設計,渲染層的界面使用 WebView 進行渲染,邏輯層采用 JSCore 線程運行 JS腳本。邏輯層數據改變,通過 setData 將數據轉發到 Native(微信客戶端),Native 再將數據轉發到渲染層,以此更新頁面。由于線程間通信成本較高,實際項目開發時需要控制頻次和數量。另外小程序的渲染層不支持運行 JS ,一些如事件處理等操作無法在渲染層實現,因此微信官方提供了一套腳本語言 WXS ,結合 WXML ,可以構建出頁面的結構(不了解 WXS ?戳這里)。

          基于小程序的雙線程架構設計,實現 i18n 存在一些技術上的難點與挑戰,由于 Mpx 框架早期構建起來的強大基礎,最終得以優雅支持多語言能力,實現了和vue-i18n 基本一致的使用體驗。

          使用

          在使用上,Mpx 支持 i18n 能力提供的 API 與 vue-i18n 大體對齊,用法上也基本一致。

          模板中使用 i18n

          編譯階段通過用戶配置的 i18n 字典,結合框架內建的翻譯函數通過 wxs-i18n-loader 合成為可執行的 WXS 翻譯函數,并自動注入到有翻譯函數調用的模板中,具體調用方式如下圖。

          // mpx文件 <template> <view> <view>{{ $t('message.hello', { msg: 'hello' })}}</view> 

          <!-- formattedDatetime計算屬性,可基于locale變更響應刷新 --> <view>{{formattedDatetime}}</view> </view> </template>

          JS 中使用 i18n

          通過框架提供的 wxs2js 能力,將 WXS 翻譯函數轉換為 JS 模塊注入到 JS 運行時,使運行時環境中也能夠調用翻譯函數。

          // mpx文件 <script> import mpx, { createComponent } from '@mpxjs/core' createComponent({ 
          

          ready () { // js中使用 console.log(this.$t('message.hello', { msg: 'hello' }))

          // 局部locale變更,生效范圍為當前組件內 this.$i18n.locale = 'en-US' setTimeout(() =>

          { // 全局locale變更,生效范圍為項目全局 mpx.i18n.locale = 'zh-CN' }, 10000)

          }, computed: { formattedDatetime () { return this.$d(new Date(), 'long') } } }) </script>

          定義 i18n 字典

          項目構建時傳入 i18n 配置對象,主要包括語言字典和默認語言類型。

          new MpxWebpackPlugin({ i18n: { locale: 'en-US',

          // messages既可以通過對象字面量傳入,也可以通過messagesPath指定一個js模塊路徑,

          在該模塊中定義配置并導出,dateTimeFormats/dateTimeFormatsPath和numberFormats/numberFormatsPath同理

          messages: { 'en-US': { message: { hello: '{msg} world' }

          }, 'zh-CN': { message: { hello: '{msg} 世界' } } }, // messagesPath: path.resolve(__dirname, '../src/i18n.js') } })

          如果是通過 Mpx 提供的 cli 工具生成的項目,這部分配置會在 mpx.conf.js 文件中,不光可以直接內聯寫在該文件中,也可以指定語言包的路徑。

          以上,Mpx 的 i18n 方案接入成本低,使用優雅,體驗優秀。直觀感受可參考下面 mpx i18n demo :https://github.com/didi/mpx/t...

          方案

          Mpx框架的 i18n 支持幾乎完全實現了 vue-i18n 的全部能力,下面我們來詳細說明 Mpx 框架 i18n 能力的具體實現。

          方案探索

          基于小程序運行環境的雙線程架構,我們嘗試了不同方案,具體探索過程如下:

          方案一:基于 Mpx 框架已提供的數據增強能力 computed 計算屬性,來支持 i18n 。該方案與 uniapp 的實現思路相似(后文會進行對比分析),存在一定不足,包括線程通信帶來的性能開銷和for循環場景下的處理較復雜等,最終放棄。
          方案二:基于 WXS + JS 支持 i18n 適配。通過視圖層注入 WXS,將 WXS 語法轉換為 JS 后注入到邏輯層,這樣視圖層和邏輯層均可實現 i18n 適配,并且在一定程度上有效減少兩個線程間的通信耗時,提高性能。

          從性能和合理性上考慮,我們最終采用了方案二進行 Mpx 的 i18n 方案實現。

          mpx-i18n內部流程示意圖

          Mpx i18n 架構設計圖

          由于各大小程序平臺上,WXS 語法和使用均存在較大差異,因此該方案實現過程中也存在一些技術上的難點,這些難點基于 Mpx 框架的早期構建起來的跨平臺能力也一一得以攻克,具體如下。

          實現難點

          WXS 在模板中運行的跨平臺處理

          WXS 是運行在視圖層中的 JS,可以減少與邏輯層通信耗時,提高性能。因此 Mpx 框架在迭代初期便已支持在模板和 JS 運行環境使用 WXS 語言,并且針對小程序跨平臺 WXS 語法進行抹平。
          在模板中,Mpx 自定義一個 webpack chunk template,以微信 WXS 作為 DSL,利用 babylon 將注入的 WXS 轉化成 ast,然后遍歷 ast 節點,抹平各大平臺對 WXS 語法的處理差異,輸出各平臺可以識別的類 WXS 文件。目前主要支持微信(WXS)、支付寶(sjs)、百度(filter)、QQ(qs)、頭條(sjs)等小程序平臺。

          WXS 在邏輯層運行的跨平臺處理

          WXS 與 JavaScript 是不同的語言,有自己的語法,并不和 JavaScript 一致。并且 WXS 的運行環境和其他 JavaScript 代碼是隔離的,WXS 中不能調用其他 JavaScript 文件中定義的函數,也不能調用小程序提供的API。
          因此在邏輯層,Mpx 將注入的 WXS 語法轉化為 JS,通過 webpack 注入到當前模塊。例如 WXS 全局方法 getRegExp/getDate 在 JS 中是無法調用的,Mpx將它們分別轉化成 JS 模塊,再通過 webpack addVariable 將模塊注入到 bundle.js 中。
          同理,Mpx 會將編譯時注入的 i18n wxs 翻譯函數和 i18n 配置對象掛載到全局 global 對象上,利用 mixin 混入到頁面組件,并監聽 i18n 配置對象,這樣JS和模板中即可直接調用 i18n 翻譯函數,實現數據響應。

          以上便是 Mpx 框架在小程序中支持 i18n 能力的技術細節,由于 WXS 是可以在視圖層執行的類 JS 語法的一門語言,這樣就減少了小程序邏輯層和視圖層的通信耗時,提升性能。但是由于實現依賴類 WXS 能力,以及 WXS 執行環境的限制,目前模板上可直接使用的翻譯函數包括 $t/$tc/$te ,如果需要格式化數字或日期可以使用對應的翻譯函數在 JS 中 Mpx 提供的計算屬性中實現。

          輸出 web 時使用 i18n

          Mpx同時還支持轉換產出H5,而 Mpx 提供的 i18n 能力在使用上與 vue-i18n 基本一致,輸出 web 時框架會自動引入 vue-i18n,并使用當前的 Mpx i18n 配置信息對其進行初始化,用戶無需進行任何更改,即可輸出和小程序表現完全一致的 i18n web 項目。

          對比

          上面分析了 Mpx 框架的 i18n 方案的技術細節,我們來看下和其他方案的對比,主要是和 uniapp - 基于 Vue 編寫小程序的方案,和微信官方的方案,兩者提供的 i18n 支持與Mpx的對比有何優劣。

          uniapp的方案

          uniapp 提供了對 i18n 能力的支持,是直接引入vue-i18n。但小程序中無法在模板上調用 JS 方法,本質上是利用計算屬性 Computed 轉換好語言,然后利用模板插值在小程序模板中使用。

          模板中:
          <view>{{ message.hello }}</view>

          JS里需要寫:

           computed: {  
              message () { return { hello: this.$t('message.hello') }
              }
            }

          因此該方案存在一個性能問題,最終的渲染層所看到的文本還是通過 setData 跨線程通信完成,這樣就會導致線程間通信增多,性能開銷較大。

          并且,早期這種形式使用成本較高,后來 uniapp 也針對其做過優化,實現了可以在模板上寫 $t() 的能力,使用上方便了不少。

          這個 t() 的實現是在編譯時候識別到t 就自動替換,幫你替換成一個 uniapp 的 computed 數據,因此數據部分還是和之前一樣要維護兩份。尤其是模板上的for循環,即使 for 里只有一個數據要被轉換,整個列表都要被替換成一個計算屬性,在線程間通信時進一步加大了性能開銷。

          微信官方的方案

          微信小程序本身也提供了一個 i18n 的方案,倉庫地址是:wechat-miniprogram/miniprogram-i18n 。

          這個方案從 i18n 本身的實現來講和Mpx框架的設計是類似的,也是基于 WXS 實現(英雄所見略同?。?。但因為周邊配套上沒有完整的體系,整體使用體驗上就也略遜于基于Mpx框架來開發支持 i18n 的國際化小程序了。

          主要的點就是,官方提供的方案,要基于 gulp 工具進行一次額外構建,同時在JS中使用時候還要額外引入一個 behavior 去讓JS中也可以使用翻譯能力。

          而Mpx框架通過一次統一的Webpack構建產出完整的內容,用戶無需擔心語言包更新后忘記重新構建,在JS中使用的時候不光更方便,而且語言信息還是個響應式的,任何組件都可以很方便地監聽語言值的變化去做一些其他的事情。

          最后,Mpx的 i18n 方案對比微信官方的方案還有個巨大的優點,結合Mpx的跨平臺能力,能實現均以這個方案,一套代碼產出支持微信/支付寶/百度/QQ/頭條多個平臺的支持 i18n 的小程序。

          總結

          Mpx 框架專注小程序開發,期望為開發者提供最舒適的開發體驗,有眾多優秀的功能特性,幫助開發者提效。本文介紹的是其內置的 i18n 能力,通過對比分析得出相比其他框架方案在使用成本和性能等方面有明顯的優勢,歡迎各位有相關需求的同學進行體驗嘗試。

          未來 Mpx 還會持續迭代優化,提供更多更好的能力幫助小程序開發者提效。在使用過程中遇到任何問題,歡迎大家在 Git 上提 issue,團隊成員會及時響應。同時也鼓勵大家一起為開源社區做貢獻,參與到 Mpx 共建中來,為小程序技術發展添磚加瓦。

          Git地址 [https://github.com/didi/mpx]
          Mpx文檔 [https://mpxjs.cn/]

          歡迎技術交流與反饋,順便star一下鼓勵開源項目貢獻者,我們將持續發力貢獻社區。

          附:以往Mpx文章鏈接
          滴滴開源小程序框架Mpx - https://mpxjs.cn/articles/1.0.html
          滴滴小程序框架Mpx發布2.0,支持小程序跨平臺開發,可直接轉換已有微信小程序 - https://mpxjs.cn/articles/2.0.html
          小程序開發者,為什么你應該嘗試下MPX - https://mpxjs.cn/articles/mpx1.html
          Mpx 小程序框架技術揭秘 - https://mpxjs.cn/articles/mpx2.html

          滴滴出行小程序體積優化實踐 - https://mpxjs.cn/articles/size-control.html

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          遠程桌面訪問阿里云服務器的方法

          seo達人

          我用的是Windows版本的阿里云服務器。

          首先,打開服務器,找到已經創建好的服務器實例并點擊。

          之后會跳轉到實例頁面,點擊右側的“管理”

          然后配置安全組。安全組中就是設置哪些IP可以訪問我們的服務器。

          然后在安全組配置規則。

          添加新規則。

          想要讓Windows電腦遠程鏈接服務器需要開放3389端口。不然就無法用自己的電腦遠程鏈接服務器了。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          配置snmpd for windows

          seo達人

          1.安裝


          Windows 安裝請參考


          默認安裝為c:/usr/ ??梢詧绦腥缦挛募员銌觭nmp agent:


          snmpd

          會提示需要配置snmpd.conf。


          No log handling enabled - turning on stderr logging

          Warning: no access control information configured.

           It's unlikely this agent can serve any useful purpose in this state.

           Run "snmpconf -g basic_setup" to help you configure the snmpd.conf file for this agent.

          NET-SNMP version 5.5

          不必使用提示中的命令,因為此命令引用了perl,但是perl的對應模塊無法跑起來??磥韕erl要完蛋的傳說并不是空穴來風。


          snmpd.conf可以自己創建到/usr/etc/snmp/snmpd.conf內。


          2.修改配置文件


          配置之前的說明:我在網上看到的所有配置都是com2sec,group,access這三個配置,但是從默認的snmp.conf文件中有一段話:




          沒必要使用 com2sec/group/access配置,使用ro(w)user,ro(w)community結合合適的views,就可以覆蓋大多數需求了。


          2.1  配置監聽地址

          snmpd默認監聽本地IP的UDP161端口,等待snmp請求


          agentAddress udp:161

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          2.2  配置視圖(view)

          格式:view viewName type oid[mask]


          參數說明:  


             

             viewName : view名稱

             type : 有兩個值:include和exclude(包括或者排除)

             oid:可以訪問的oid(mib子樹)

             [mask]:對oid的掩碼 (可選參數)

          案例:


          view systemonly included .1.3.6.1.2.1

          2.3  配置共同體(community)

          格式:ro(w)community communityName source


          參數說明:


          rocommunity定義一個只讀權限的共同體,rwcommunity定義一個讀寫權限的共同體

          rocommunity6或   rwcommunity6表示監聽IPv6。

          communityName:共同體名稱

          source:可以訪問的IP地址范圍,默認為”default”,即任何IP都能訪問。


                         可選參數:-V viewName  限制共同體只能訪問viewName下的節點


          實際配置文件

          agentAddress udp:161

          view systemonly included .1.3.6.1.2.1

          rocommunity public default

          3. 測試

          修改完配置之后,重啟snmpd:


          snmpd

          連接測試:(該節點表示獲取主機內存大小)


          snmpwalk -v 1 -c public localhost .1.3.6.1.2.1.1.1

          SNMPv2-MIB::sysDescr.0 = STRING: Windows DESKTOP-70OA76Q 6.2.9200   Professional

          得到類似以上的結果,就說明snmpd配置成功。


          配置MIB庫

          Windows版本的snmp自帶有很多MIB,位于C:\usr\share\snmp\mibs


          因此可以對OID和MIB name做互相轉換:


          snmptranslate -On SNMPv2-MIB::sysDescr.0

          .1.3.6.1.2.1.1.1.0


          snmptranslate .1.3.6.1.2.1.1.1.0

          SNMPv2-MIB::sysDescr.0

          添加自己的mib

          之前的筆記有提到自己創建的一個定制mib文件


          https://github.com/1000copy/tbit-guard-snmp/blob/master/tbit.mib

          可以把它加入到C:\usr\share\snmp\mibs目錄內,文件名無所謂。然后為snmptranslate加入選項 -mALL ,表示加載所有在此目錄內的mib文件:


          snmptranslate -m ALL .1.3.6.1.4.1.66666

          你應該看到如下消息,表明mib加載成功:


          tbitinc::tbit

          詳細的說明如下:


          -m MIBLIST

               指定一個用冒號分隔的MIB模塊列表(不是文件),以便為這個應用程序加載。 這將覆蓋(或增加)環境變量MIBS、snmp.conf的內容。指令mibs,以及硬編碼到Net-SNMP庫中的MIBs列表。如果MIBLIST有一個前導的'-'或'+'字符,那么所列出的MIB模塊將被加載到默認列表之外,分別位于該列表之前或之后。

               否則,將加載指定的MIB,而不是這個默認列表。特殊關鍵字ALL用于加載MIB目錄搜索列表中的所有MIB模塊。 每一個名字不以". "開頭的文件都會被解析為是一個

               MIB文件。

          -M DIRLIST

               指定一個以冒號分隔的目錄列表來搜索MIB。 這將覆蓋(或增強)環境變量MIBDIRS和snmp.conf指令mibdirs。

               以及硬編碼到 Net-SNMP 庫中的默認目錄 (/usr/share/snmp/mibs)。


               如果DIRLIST有一個前導的'-'或'+'字符,那么給定的目錄會被添加到默認列表中,在這個列表的目錄之前或之后進行搜索。

               分別進行搜索。 否則,將搜索指定的目錄,而不是這個默認列表。


               請注意,列表中出現在后面的目錄要比前面的目錄優先。 要避免搜索任何MIB目錄,請將MIBDIRS環境中的

               變量為空字符串("")。


               請注意,使用-m選項或mibs配置指令指定的MIB將從-M選項(或等價物)列出的目錄中加載。

               mibfile指令采用的是指定MIB文件的完整路徑,所以不需要在MIB目錄搜索列表中出現。

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合