Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日本一区二区免费在线观看,一区二区手机视频,天堂网2014av

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Flutter Web在美團(tuán)外賣的實(shí)踐

          Flutter Web在美團(tuán)外賣的實(shí)踐

          多形態(tài)業(yè)務(wù)場(chǎng)景下,如何保障多端體驗(yàn)的一致性,是前端技術(shù)領(lǐng)域一個(gè)比較受關(guān)注的方向。美團(tuán)外賣前端技術(shù)團(tuán)隊(duì)基于 Flutter Web 探索跨端(App\PC\H5)的解決方案,真正實(shí)現(xiàn)“Write Once & Run AnyWhere”。本文系該團(tuán)隊(duì)的實(shí)踐經(jīng)驗(yàn)總結(jié),希望能對(duì)大家有所幫助或者啟發(fā)。

          一、背景

          1.1 業(yè)務(wù)背景

          美團(tuán)外賣商家端業(yè)務(wù)形態(tài)

          美團(tuán)外賣商家端業(yè)務(wù)圍繞數(shù)百萬(wàn)商家,在 PC 和 App 上分別提供了交易履約、運(yùn)營(yíng)、廣告、營(yíng)銷等一系列功能,且經(jīng)常有外投 H5 的場(chǎng)景(如外賣學(xué)院、商家社區(qū)、營(yíng)銷活動(dòng)等)。在這種多形態(tài)的業(yè)務(wù)場(chǎng)景下,如何保障多端體驗(yàn)的一致性,以及如何提升多端迭代的效率,一直是商家端產(chǎn)研關(guān)注的重點(diǎn)。

          1.1.1 保障多端體驗(yàn)一致性

          由于端能力的不同,導(dǎo)致了業(yè)務(wù)在 App 和 Web 上存在較大的表現(xiàn)差異,例如:App 上自帶動(dòng)畫轉(zhuǎn)場(chǎng),而在 Web 中的實(shí)現(xiàn)成本卻較高,往往也就降級(jí)舍棄了這部分功能。此外,即使我們可利用公司內(nèi)部的 Roo、MTDUI 等多端 UI 組件庫(kù)來(lái)盡量抹平各端的 UI 差異,但由于組件庫(kù)在各端的實(shí)現(xiàn)不盡相同,很難做到完美的一致性體驗(yàn)。

          1.1.2 提升多端迭代效率

          由于各端技術(shù)體系的不同,涉及多端的需求往往需要不同的開發(fā)、測(cè)試團(tuán)隊(duì)各自完成開發(fā)、聯(lián)調(diào)、測(cè)試、上線等流程,占用資源巨大,在各團(tuán)隊(duì)不可并行支持的情況下,甚至可能導(dǎo)致整個(gè)業(yè)務(wù)交付周期被拉長(zhǎng)。雖然 React Native、Flutter 等跨平臺(tái)方案解決了一部分復(fù)用的問題,但顯然在商家端業(yè)務(wù)場(chǎng)景下是遠(yuǎn)遠(yuǎn)不夠的,我們的目標(biāo)是要達(dá)到全平臺(tái)(Android、iOS、PC、H5)復(fù)用,最大化地提升多端的迭代效率。

          1.2 技術(shù)背景

          1.2.1 Flutter 在美團(tuán)外賣商家端的儲(chǔ)備

          MTFlutter 是美團(tuán)外賣搭建起的公司級(jí) Flutter 研發(fā)生態(tài),它的架構(gòu)圖如下圖所示:

          MTFlutter 架構(gòu)圖

          如圖所示,MTFlutter 已涵蓋研發(fā)、調(diào)試、測(cè)試、發(fā)布、線上運(yùn)維及工程管理整套閉環(huán),同時(shí)落地了動(dòng)態(tài)化解決方案,支撐了公司多個(gè)業(yè)務(wù)發(fā)展。在大前端融合的趨勢(shì)下,美團(tuán)外賣商家端持續(xù)在探索更優(yōu)的多端復(fù)用方案,通過 MTFlutter 生態(tài)的建設(shè),目前 Flutter 技術(shù)棧已覆蓋商家端 App 中 90%以上的業(yè)務(wù),同時(shí)具備 Flutter 開發(fā)能力的同學(xué)也達(dá)到 90% 以上。因此,在有足夠技術(shù)“儲(chǔ)備”的前提下,我們能夠基于 Flutter 做全平臺(tái)(Android、iOS、PC、H5)復(fù)用的探索。

          1.2.2 Flutter Web 的支持

          2018 年 Google 首次公開 Flutter Web Beta 版,旨在進(jìn)一步實(shí)現(xiàn)一份代碼、多端運(yùn)行的愿景。目前,F(xiàn)lutter Web 已被正式合入 Master,期間經(jīng)過無(wú)數(shù)工程師的努力,F(xiàn)lutter Web 已能提供與 Flutter Natvie 較統(tǒng)一的交互行為和視覺體驗(yàn)。

          Flutter Native VS Flutter Web

          如上圖可知,F(xiàn)lutter Web 與 Flutter Native 的整體架構(gòu)相似,二者共用 Framework 層(綠色部分),提供了包括動(dòng)畫、手勢(shì)、基礎(chǔ) Widget 類,以及大部分應(yīng)用所需的 Material/Cupertino 主題 Widget 集合。區(qū)別在于:Flutter Web 重寫了 dart:ui 層(黃色部分),利用 DOM、Canvas 對(duì)齊了 Flutter Native 的 UI 渲染能力,使得 Flutter 編寫的 UI 能夠在現(xiàn)代瀏覽器上正常展示。

          此外,得益于 dart2js 這個(gè)早已成熟的工具,Dart 邏輯能夠很容易的轉(zhuǎn)換為 JavaScript,進(jìn)而在 Web 中被正常運(yùn)行。

          二、面臨的挑戰(zhàn)

          綜上所述,我們選擇基于 Flutter Web 探索跨端(App\PC\H5)解決方案,真正實(shí)現(xiàn)“Write Once & Run AnyWhere”。當(dāng)然,面臨挑戰(zhàn)也是巨大的,主要體現(xiàn)在 Flutter 和 MTFlutter 現(xiàn)階段對(duì) Web 支持還不是很充足。

          2.1 Flutter Web 現(xiàn)狀

          Google 官方目前對(duì) Flutter Web 的工作主要還集中在 dart:ui(Web)的對(duì)齊,工程化和性能相關(guān)的事項(xiàng)做的還比較少,例如:

          • Flutter Web 構(gòu)建產(chǎn)物較簡(jiǎn)陋,只是簡(jiǎn)單的輸出 main.dart.js(1.1M,未 Gzip) 和 圖片等靜態(tài)資源,缺少 JS 拆包、文件 Hash、資源上傳 CDN 等優(yōu)化工作,極大影響了頁(yè)面的加載性能。
          • 由于 Flutter Web 自身實(shí)現(xiàn)了一套頁(yè)面滾動(dòng)機(jī)制,頁(yè)面滾動(dòng)過程中,會(huì)頻繁計(jì)算位置信息,引起滾動(dòng)區(qū)域內(nèi)容被重新創(chuàng)建,最終導(dǎo)致頁(yè)面滾動(dòng)性能較差。

          2.2 MTFlutter 現(xiàn)狀

          雖然 MTFlutter 做了諸多 Flutter Native 層面的定制與優(yōu)化,但在 Flutter Web 上的建設(shè)才剛起步,具體表現(xiàn)在:

          • MTFlutter 現(xiàn)有的基礎(chǔ)依賴如:Request(請(qǐng)求封裝)、Router(路由)、埋點(diǎn)、容器橋、前端監(jiān)控,尚未支持在 Web 中的實(shí)現(xiàn)。
          • MTFlutter 已實(shí)現(xiàn)了完整的 Flutter Module 的打包發(fā)布流程,但并不支持 Web 的構(gòu)建與部署。

          三、整體設(shè)計(jì)

          MTFlutter 架構(gòu)圖

          上圖為 MTFlutter + Web 架構(gòu)圖,由圖可知 Flutter Web 頁(yè)面要滿足投產(chǎn)要求,還有大量的工作(上圖黃色部分所示),主要包括:

          • 擴(kuò)展基礎(chǔ)依賴(如:Request、Router、埋點(diǎn)等)在 Web 側(cè)的支持。
          • 完善工程化建設(shè),例如:靜態(tài)資源優(yōu)化、構(gòu)建與部署自動(dòng)化。
          • 深入滾動(dòng)性能與頁(yè)面加載性能優(yōu)化,使得 Flutter Web 能夠滿足基本的投產(chǎn)要求。

          四、詳細(xì)設(shè)計(jì)

          4.1 基礎(chǔ)依賴建設(shè)

          企業(yè)級(jí)應(yīng)用的基礎(chǔ)開發(fā)依賴 (如:請(qǐng)求庫(kù)、路由庫(kù)、埋點(diǎn)庫(kù)等),要重新在 Flutter 中用 Dart 搭建一套,時(shí)間成本、兼容性、風(fēng)險(xiǎn)等都是不可控的。而 MTFlutter 是基于原有 Native 基礎(chǔ)依賴開發(fā)的 Plugin,因此并不支持 Web 端。此章節(jié)將展開介紹如何絲滑無(wú)感地?cái)U(kuò)展 MTFlutter 基礎(chǔ)依賴在 Web 端的實(shí)現(xiàn)。

          4.1.1 Flutter Package 分平臺(tái)編程

          在 Flutter 中通過使用 Package 可以創(chuàng)建易于共享的模塊化代碼。官方強(qiáng)烈推薦使用 Package 形式管理各種工具方法。在官方定義中 Package 包含以下兩種類別:

          1. Dart Package:用 Dart 編寫的常規(guī) Package,其中一些可能包含依賴于 Flutter 框架的特定功能,其使用范圍僅限于 Flutter,例如 path。
          2. Plugin Package:用 Dart 編寫 API 多個(gè)平臺(tái)各自實(shí)現(xiàn)的特殊 Dart Package。Plugin Package 可以為 Android(使用 Kotlin 或 Java)、iOS(使用 Swift 或 Objective-C)、Web、macOS、Windows 或 Linux 或其任意組合編寫插件包。

          下面分別對(duì)這兩種類型 Package 中如何分平臺(tái)編程進(jìn)行介紹。

          (1) Dart Package

          Dart Package 是純 Dart 編寫,因此大部分代碼均可由 dart2js 直接編譯出 Web 平臺(tái)可運(yùn)行的代碼,但某些涉及 Native 能力的庫(kù) (如 dart:io)是無(wú)法被轉(zhuǎn)譯的,因此需要有對(duì)平臺(tái)進(jìn)行兼容的方法,下面介紹兩種在 Dart Package 中分平臺(tái)編程的方案。

          代碼級(jí)別分平臺(tái)

          針對(duì)代碼級(jí)別的分平臺(tái),我們可以借助 Flutter SDK 提供的一個(gè)常量 kIsWeb。使用方法如下:

          查看源碼可知,kIsWeb 之所以能被用于判斷 Web 平臺(tái),是利用了 JavaScript 不支持整型的特征,在 Web 環(huán)境下,Dart 的 double 和 int 由相同類型的對(duì)象支持,浮點(diǎn)數(shù) "0.0" 等于整數(shù) "0",對(duì)于在 AOT 或 VM 上運(yùn)行的 Dart 代碼卻并非如此。

          import 'package:flutter/foundation.dart';
          if (kIsWeb) {
            print('Web 端')
          } else {
            print('其他端');
          }
          

          文件級(jí)別分平臺(tái)

          針對(duì)文件級(jí)別分平臺(tái),我們利用條件導(dǎo)入導(dǎo)出,其中條件導(dǎo)出具體用法如下:

          // tool.dart
          export 'src/tool_native.dart' // 兜底導(dǎo)出,即沒有命中條件時(shí)導(dǎo)出的文件
            if (dart.library.html) 'src/tool_web.dart'; // web 端導(dǎo)出的文件,該文件中可以使用 dart:html,也可以通過判斷 dart.library.js 導(dǎo)出 Web 端文件。
          
          // 引入 tool.dart
          import 'package:tool/tool.dart';
          void main() {
            print('import tool');
          }
          

          條件導(dǎo)入和條件導(dǎo)出類似,僅需將 export 改為 import 即可。在業(yè)務(wù)開發(fā)中這也是一種非常實(shí)用的分平臺(tái)編程方法。

          (2) Plugin Package

          Plugin Package (下文簡(jiǎn)稱為 Plugin) 在 Android 和 iOS 平臺(tái)都是通過 MethodChannel 實(shí)現(xiàn)在 UI 層和 Platform 層傳遞消息從而達(dá)到特定平臺(tái)支持的,官方文檔中也全方位介紹了在 Android 和 iOS 平臺(tái)的具體實(shí)現(xiàn)方法及例子,Web 平臺(tái)的實(shí)現(xiàn)卻介紹的較少。總結(jié)起來(lái),Web 平臺(tái)和 Native 平臺(tái)實(shí)現(xiàn)方式的不同主要集中在下面兩點(diǎn)。

          首先,Web Plugin 推薦的方式不是以其平臺(tái)特有的 JS 語(yǔ)言實(shí)現(xiàn),而是通過 Dart Library 或 Package 實(shí)現(xiàn),對(duì)于已有現(xiàn)成可用的 JS SDK 或需要大量使用 JS 實(shí)現(xiàn)功能的情況下,官方提供了 package:js 包調(diào)用 Javascript,從而實(shí)現(xiàn)與 Javascript 的交互。

          其次,Web Plugin 不是通過注冊(cè) MethodChannel 傳遞消息的,F(xiàn)lutter 內(nèi)部可直接調(diào)用通過官方指定形式 (Federated Plugin) 編寫的 Flutter Web Plugin 類。

          下圖完整的展示了一個(gè) Plugin 的整體架構(gòu):

          4.1.2 基礎(chǔ)依賴建設(shè)

          整體來(lái)講,MTFlutter 基礎(chǔ)依賴都是使用 Plugin 的形式開發(fā)維護(hù)的。為處理依賴中的公共邏輯,提高 Plugin 的可擴(kuò)展性,MTFlutter Plugin 在 Flutter Plugin 架構(gòu)(各平臺(tái)原生實(shí)現(xiàn)層和 Plugin Interface 層)之上又增加了公共邏輯處理層,最終暴露給用戶是 Plugin API 層提供的接口。MTFlutter Plugin 架構(gòu)圖如下:

          MTFlutter Plugin 架構(gòu)圖

          在細(xì)節(jié)實(shí)現(xiàn)上,由于項(xiàng)目中各種依賴的類型之間存在著差異,因此在依賴處理上也略有不同,下面介紹擁有不同特點(diǎn)的依賴所對(duì)應(yīng)解決方案。

          (1)各平臺(tái)實(shí)現(xiàn)能在 Web 側(cè)對(duì)齊的場(chǎng)景,如埋點(diǎn)庫(kù)

          埋點(diǎn)庫(kù)無(wú)論在 Native 端還是在 Web 端都是使用公司統(tǒng)一提供的 SDK,在 API 設(shè)計(jì)上具有天然的一致性,因此我們完全有能力在 Plugin Interface 層對(duì)齊所有接口,上層業(yè)務(wù)邏輯只需按需做些兼容處理即可。埋點(diǎn)庫(kù) Web 端擴(kuò)展的整體設(shè)計(jì)思路如下:

          1. 在業(yè)務(wù)項(xiàng)目的 web/index.html 文件中直接引入 Script 腳本并且進(jìn)行初始化 (注意:引入 Script 的位置,需要放在 main.dart.js 前面)。
          2. 借助 package:js 庫(kù)調(diào)用埋點(diǎn) JS SDK,對(duì)齊 Flutter 埋點(diǎn)庫(kù)的 API ,實(shí)現(xiàn) Flutter Plugin 的 Web 端支持,詳細(xì)架構(gòu)圖如下圖所示:

          (2)各平臺(tái)實(shí)現(xiàn)在 Web 側(cè)無(wú)法對(duì)齊的場(chǎng)景,如路由庫(kù)

          MTFlutter 路由庫(kù)是 Native 底層維護(hù)的一套全新的路由體系,依靠原生支持提供了強(qiáng)大的定制化功能,而在 Web 端無(wú)法這些無(wú)法在各平臺(tái)原生實(shí)現(xiàn)層達(dá)到 100% 支持。由于 MTFlutter Plugin 最終暴露的是 Plugin API,因此我們選擇直接對(duì)齊 Plugin API 實(shí)現(xiàn)路由庫(kù)在 Web 端的支持(借助 Flutter Navigator、dart:html 用純 Dart 語(yǔ)言完成了擴(kuò)展),詳細(xì)架構(gòu)如下圖所示:

          路由庫(kù)架構(gòu)圖

          (3)Web 端需要通過大量 JS 實(shí)現(xiàn)功能的依賴庫(kù),如請(qǐng)求庫(kù)

          由于在現(xiàn)有的 Web 請(qǐng)求中統(tǒng)一封裝著大量的業(yè)務(wù)處理邏輯(如攔截器、異常上報(bào)等),如果用 Dart 重新實(shí)現(xiàn)一遍,成本還是較高的。想復(fù)用原有基于 Axios( JS 請(qǐng)求庫(kù)) 封裝的請(qǐng)求庫(kù)就相當(dāng)于讓 Plugin 的 Web 平臺(tái)實(shí)現(xiàn)使用 JS 語(yǔ)言。Dart 和 JS 交互是通過 package:js 進(jìn)行接口調(diào)用,因此我們?cè)诠策壿嬏幚韺佑?Dart 對(duì)齊了相應(yīng)的 API,詳細(xì)架構(gòu)圖如下圖所示:

          請(qǐng)求庫(kù)架構(gòu)圖

          4.2 性能優(yōu)化

          常規(guī)的 Web 項(xiàng)目中,為了保證頁(yè)面有更好的加載和渲染性能,在靜態(tài)資源文件的處理方面,我們需要做很多的工作,例如:資源文件 Hash 化、CDN 化、按需加載處理等,這些可以通過 Webpack、Rollup 等構(gòu)建工具進(jìn)行預(yù)處理。但在 Flutter Web 中,這些預(yù)處理的操作目前官方還不支持,原因是 Flutter 暴露給我們的命令只有一個(gè) flutter build web,導(dǎo)致我們無(wú)法直接進(jìn)行更細(xì)粒度的個(gè)性化定制。如果想要讓 Flutter Web 達(dá)到企業(yè)級(jí)應(yīng)用的標(biāo)準(zhǔn),我們需要更深層次的探索 Flutter SDK 的運(yùn)行原理。下面我們列出目前遇到的性能問題及其解決方案。

          4.2.1 目前存在的性能問題

          Google 官方對(duì) Flutter Web 性能優(yōu)化所做的事項(xiàng)還比較少,編譯輸出的頁(yè)面存在較大的性能問題,主要體現(xiàn)在以下兩方面:

          1. 首屏渲染時(shí)間長(zhǎng)。即使使用了 FutureBuilder 把業(yè)務(wù)代碼拆分成 xxx.part.js 之后,main.dart.js 體積依然維持在 1.1M。單一文件加載、解析時(shí)間過長(zhǎng),且靜態(tài)資源缺少 CDN 化的支持,勢(shì)必會(huì)影響首屏的渲染時(shí)間。
          2. 滾動(dòng)性能較差。 Flutter Web 自身實(shí)現(xiàn)了一套頁(yè)面滾動(dòng)機(jī)制,在頁(yè)面滾動(dòng)過程中,會(huì)頻繁的創(chuàng)建 Canvas,最終導(dǎo)致滾動(dòng)性能問題,甚至引起頁(yè)面 Crash。

          通過下圖對(duì)瀏覽器網(wǎng)絡(luò)監(jiān)控情況的展示,可以清晰的反映出以上問題:



          為了解決上述的性能問題,我們探索了 Flutter SDK 編譯過程,總結(jié)出從 Flutter 業(yè)務(wù)代碼到 Web 產(chǎn)物的整體流程,詳細(xì)流程如下圖所示:

          從流程中我們可以看到,F(xiàn)lutter 在 Web 端目前只支持 Dart-->JS 的轉(zhuǎn)換,以及 UI 層的對(duì)齊,在工程化和性能優(yōu)化方面做的工作并不多。

          因此,我們必須解決以上的性能問題,才能保證我們的業(yè)務(wù)可以正常的交付。通過對(duì)編譯流程的仔細(xì)分析與梳理,我們?cè)?AOT 產(chǎn)物生成之前對(duì) Flutter SDK 進(jìn)行定制,分別進(jìn)行加載性能優(yōu)化內(nèi)存性能優(yōu)化,下面分別介紹這兩部分的內(nèi)容。

          Flutter SDK 進(jìn)行定制后的流程

          4.2.2 加載性能優(yōu)化

          運(yùn)行 flutter build web 命令之后,我們得到的主要靜態(tài)資源有:主文件 main.dart.js(1.1M),各頁(yè)面的業(yè)務(wù)代碼 xxx.part.js(使用 FutureBuilder 后)、圖片文件。直接應(yīng)用這些資源到項(xiàng)目中,會(huì)遇到以下問題:

          1. 功能無(wú)法及時(shí)更新:瀏覽器對(duì)同名文件的緩存,可能導(dǎo)致程序代碼不被及時(shí)更新或者出現(xiàn)執(zhí)行錯(cuò)亂。
          2. 首屏渲染性能差:main.dart.js 文件過大,單一文件加載、解析時(shí)間過長(zhǎng),勢(shì)必會(huì)影響首屏的渲染時(shí)間。
          3. 無(wú)法使用 CDN:Flutter 僅支持相對(duì)路徑的加載方式,無(wú)法使用當(dāng)前域名以外的 CDN 域名,導(dǎo)致無(wú)法享受 CDN 帶來(lái)的優(yōu)勢(shì)。

          為此,在加載部分我們對(duì) Flutter SDK 增加了如下三方面的優(yōu)化,以達(dá)到線上運(yùn)行的標(biāo)準(zhǔn),優(yōu)化步驟如下圖所示:

          優(yōu)化步驟

          資源文件 Hash 化

          除了 web/index.html 文件之外,我們要對(duì)所有的引用到文件進(jìn)行 Hash 化。對(duì) build_system/web.dart 的修改按以下步驟進(jìn)行:

          1. 遍歷產(chǎn)物目錄,并建立 ResourceMap。
          2. 分別計(jì)算每個(gè)文件的 Hash 值。
          3. 為新文件命名為 name-[hash].xxx。
          4. 修改新文件名在對(duì)應(yīng)文件中的引用關(guān)系。

          大文件分片

          Flutter Web 編譯之后會(huì)生成 main.dart.js 這一主文件,體積為1.1M( Gzip 之后約 400K ),這給頁(yè)面的加載性能帶來(lái)很大的影響。為此,我們對(duì)代碼進(jìn)行分片,借助瀏覽器對(duì)多文件并行加載的特性,可以有效提升頁(yè)面的加載性能。

          具體實(shí)施步驟是:將 main.dart.js 在 Dart 側(cè)拆分成多份純文本文件,前端通過 XHR 的方式并行加載并按順序拼接成 Javascript 代碼置于 <script> 標(biāo)簽中,從而實(shí)現(xiàn)分片文件的并行加載。

          Hash化以及分片之后,靜態(tài)資源的引用關(guān)系

          資源文件 CDN 化

          由于 Flutter Web 資源引用機(jī)制的不同,即使在資源文件 Hash 化的過程中,把文件的相對(duì)路徑替換成帶 CDN 域名的絕對(duì)路徑,也無(wú)法實(shí)現(xiàn) CDN 資源的加載。同時(shí)本地測(cè)試發(fā)現(xiàn)圖片和 Javascript 資源的加載邏輯還不盡相同,為此針對(duì)各自的加載邏輯要分別進(jìn)行優(yōu)化。

          • 圖片處理:經(jīng)過對(duì)源碼的大量閱讀及梳理,我們發(fā)現(xiàn)圖片請(qǐng)求的 URL 首先會(huì)讀取 meta 標(biāo)簽中 assetBase 值進(jìn)行 URL 路徑拼接,根據(jù)拼接好的 URL 來(lái)獲取資源。目前,在項(xiàng)目 web/index.html 模板文件中并沒有 meta 標(biāo)簽,于是就會(huì)根據(jù)相對(duì)路徑進(jìn)行請(qǐng)求。解決方案是在編譯過程中,根據(jù)請(qǐng)求環(huán)境增加 meta 標(biāo)簽并把 content 設(shè)置為 CDN 路徑。
          • JavaScript 處理:為了解決圖片資源文件的加載問題,我們雖然增加了 assetBasemeta 標(biāo)簽,但發(fā)現(xiàn) xxx.part.js 文件依然使用當(dāng)前域名進(jìn)行加載,可見 Javascript 資源的加載和圖片資源加載的邏輯不盡相同。對(duì) main.dart.js 源碼分析,我們發(fā)現(xiàn)請(qǐng)求 xxx.part.js 的域名取決于包含 main.dart.js 內(nèi)容的 Script 標(biāo)簽的 src 屬性。通過對(duì) js_helper.dart 的動(dòng)態(tài)編譯,我們把讀取 src 屬性修改為讀取 window.assetBase 這一全局變量(meta標(biāo)簽中 assetBase 值加工后的變量)來(lái)實(shí)現(xiàn) xxx.part.js 文件的 CDN 加載。

          4.2.3 滾動(dòng)性能優(yōu)化

          當(dāng)頁(yè)面出現(xiàn)可滾動(dòng)區(qū)域時(shí),每次頁(yè)面滾動(dòng)會(huì)創(chuàng)建大量的 Canvas。使用 Safari 的 Canvas 分析工具,我們發(fā)現(xiàn)問題的根本原因是頁(yè)面滾動(dòng)的過程中,F(xiàn)lutter 會(huì)頻繁的創(chuàng)建滾動(dòng)區(qū)域的 Canvas,每次創(chuàng)建的 Canvas 內(nèi)存都在10~70M 不等,滾動(dòng)的內(nèi)容越多,內(nèi)存的占用就會(huì)越大,這樣滾動(dòng)幾幀之后,內(nèi)存的占用就會(huì)超過瀏覽器的閾值。

          Safari 圖形工具中展示 Canvas 的占用

          Flutter 對(duì) Canvas 的管理有一個(gè) ReusablePool 的概念,在初始過程中會(huì)創(chuàng)建一定的數(shù)量的 Canvas,頁(yè)面交互過程中沒有變化的部分,會(huì)優(yōu)先使用 pool 中已經(jīng)緩存過的 Canvas 以便能夠節(jié)省內(nèi)存。由于 Flutter Web 自身實(shí)現(xiàn)了一套頁(yè)面滾動(dòng)機(jī)制,頁(yè)面滾動(dòng)過程中,會(huì)頻繁計(jì)算位置信息,引起滾動(dòng)區(qū)域內(nèi)容被重新創(chuàng)建,這就是為什么每次滾動(dòng)都會(huì)創(chuàng)建 Canvas 的原因。

          我們?cè)O(shè)計(jì)的解決方案是:修改 FlutterSDK,在滾動(dòng)的過程中定義一個(gè)閾值,當(dāng)滾動(dòng)的高度在閾值范圍內(nèi),我們就會(huì)把當(dāng)前的 Canvas 緩存起來(lái)。這樣選擇性的創(chuàng)建和銷毀 Canvas 可以有效的緩解內(nèi)存壓力,從而提升頁(yè)面滾動(dòng)性能。

          優(yōu)化之后瀏覽器創(chuàng)建和銷毀 Canvas 的過程

          4.3 構(gòu)建與部署

          4.3.1 Docker 鏡像定制

          由于 MTFlutter Web 環(huán)境安裝步驟較固定,且整個(gè)安裝過程耗時(shí)較長(zhǎng) ( > 80s ) 。因此將其定制為 Docker 鏡像并集成至 Talos,F(xiàn)lutter Web 編譯階段便能免去安裝流程,有效提升構(gòu)建效率。Docker 鏡像定制和發(fā)布的詳細(xì)流程見官方文檔,本文不再贅述。其中用于定制 Flutter Web 鏡像的 Dockerfile 文件如下:

          FROM $BaseImage \# 繼承基礎(chǔ)鏡像
          RUN apt-get update
          RUN apt-get install rubygems -y
          RUN gem install flutter-cli
          RUN flutter-cli install
          ENV PATH="/$User/.flutter_sdk/bin:${PATH}"
          ENV PUB\_HOSTED\_URL="https://xxx.com" \# 私有pub服務(wù)
          ENV FLUTTER\_STORAGE\_BASE_URL="https://storage.flutter-io.cn"
          RUN ~/.flutter_sdk/bin/flutter config --enable-web
          

          4.3.2 持續(xù)交付與部署

          為了實(shí)現(xiàn)持續(xù)交付與部署,我們建立起了 Flutter Web 在 Talos(美團(tuán)內(nèi)部前端持續(xù)交付解決方案) 中的發(fā)布流水線:

          Talos 發(fā)布流水線

          可以看到,流水線中已經(jīng)免去了 MTFlutter Web 環(huán)境的安裝流程,現(xiàn)有流水線中重要節(jié)點(diǎn)介紹如下:

          • Flutter-Web-Build 利用 Docker 內(nèi)置的 MTFlutter 進(jìn)行 Web 編譯。
          • Flutter-Web-Publish 負(fù)責(zé)將編譯產(chǎn)物上傳美團(tuán)資源存儲(chǔ)服務(wù)器。

          五、成果展示

          5.1 效果展示

          我們?cè)诿缊F(tuán)外賣商家學(xué)院(一個(gè)以文章、視頻等形式幫助商家學(xué)習(xí)外賣運(yùn)營(yíng)知識(shí)、了解行業(yè)發(fā)展和平臺(tái)策略的平臺(tái),它有很強(qiáng)的傳播屬性,具有外部投放的場(chǎng)景)率先落地了 Flutter Web,現(xiàn)以商家學(xué)院視頻內(nèi)容頁(yè)為例,對(duì)比 Flutter Native 和 Flutter Web 的展現(xiàn)效果:


          Flutter Web

          可以看出,兩者的交互、視覺體驗(yàn)是高度一致的,既保證了業(yè)務(wù)在 App 內(nèi)接近 Native 的體驗(yàn),又極大提高了 Web 與 Flutter Native 的體驗(yàn)一致性。

          5.2 頁(yè)面加載性能

          如前文所述,我們實(shí)施了一系列針對(duì) Flutter Web 的資源優(yōu)化手段,使得頁(yè)面加載性能有較大提升,其中頁(yè)面完全加載時(shí)間大致由 1300ms (TP50) 降到了 580ms(TP50),更多的性能指標(biāo)數(shù)據(jù)見下圖:

          某7日性能趨勢(shì)圖

          可以看到 Flutter Web 與現(xiàn)有 Web 項(xiàng)目性能指標(biāo)數(shù)據(jù)差距已不大,可滿足日常業(yè)務(wù)要求。但加載性能數(shù)據(jù)仍有較大的優(yōu)化空間,我們會(huì)持續(xù)對(duì)其進(jìn)行探索。

          5.3 滾動(dòng)性能

          針對(duì)滾動(dòng)優(yōu)化,我們通過修改 Flutter SDK,使得 Canvas 在頁(yè)面滾動(dòng)時(shí)無(wú)需重復(fù)創(chuàng)建,而是被緩存起來(lái)。這樣大大節(jié)省了內(nèi)存的開銷(優(yōu)化后頁(yè)面內(nèi)存占用穩(wěn)定為 100M 左右,與常規(guī) Web 頁(yè)面無(wú)異),同時(shí)在一定程度上提升了滾動(dòng)性能。以商家學(xué)院文章內(nèi)容頁(yè)為例,對(duì)比優(yōu)化前后滾動(dòng) FPS :

          優(yōu)化前 FPS

          優(yōu)化后 FPS

          可以看到,F(xiàn)lutter Web 頁(yè)面滾動(dòng)性能已得到較大提升,足以應(yīng)對(duì)大部分業(yè)務(wù)場(chǎng)景。但由于 Flutter Web 頁(yè)面滾動(dòng)過程中會(huì)頻繁進(jìn)行位置信息的計(jì)算,在復(fù)雜的業(yè)務(wù)場(chǎng)景(如頁(yè)面存在大量動(dòng)畫) 仍然會(huì)暴露出一定的問題。因此對(duì)滾動(dòng)性能的進(jìn)一步優(yōu)化也會(huì)是我們未來(lái)的工作重心。

          5.4 業(yè)務(wù)迭代效率

          基于團(tuán)隊(duì)對(duì) Flutter Web 工程化能力的建設(shè)和 Flutter 良好的跨平臺(tái)特性,F(xiàn)lutter Web 在美團(tuán)外賣商家學(xué)院改版需求的落地,大大提升了迭代效率,估算人效提升 40% 以上,計(jì)算公式為:

          其中 E 代表人效提升,Ci 指的是兼容和適配所耗費(fèi)的時(shí)間,Np 表示業(yè)務(wù)跨端數(shù)量,目前美團(tuán)外賣商家學(xué)院在 Native 和 H5 兩端完成了復(fù)用,后續(xù)在 PC 側(cè)需求的對(duì)齊中,效率提升數(shù)值會(huì)被放大,預(yù)計(jì)人效提升達(dá) 60% 以上。同時(shí)我們將在更多的業(yè)務(wù)中進(jìn)行推廣與應(yīng)用,提升整體業(yè)務(wù)的迭代效率。

          六、總結(jié)與展望

          綜上所述,美團(tuán)外賣商家端多元的業(yè)務(wù)形態(tài)和足夠的技術(shù)“儲(chǔ)備”,使得基于 Flutter 實(shí)現(xiàn)多端復(fù)用成為了可能。而 Flutter Web 在美團(tuán)外賣商家學(xué)院業(yè)務(wù)中也取得了階段性的成果,實(shí)現(xiàn)了 App、H5 側(cè)的體驗(yàn)一致性,為后續(xù)推動(dòng)更多業(yè)務(wù)線實(shí)現(xiàn) App-Web 一體化打下了堅(jiān)實(shí)的基礎(chǔ)。

          可以預(yù)見的是,基于 Flutter Web 實(shí)現(xiàn)的多端復(fù)用,勢(shì)必會(huì)有效縮短項(xiàng)目交付周期。但由于我們對(duì)頁(yè)面加載性能、滾動(dòng)性能做的仍不夠完美,不足以應(yīng)對(duì)更加復(fù)雜的業(yè)務(wù)場(chǎng)景,因此我們依然還有許多工作:

          • 頁(yè)面滾動(dòng)性能優(yōu)化: 由于 Flutter 與 Web 的布局差異,使得 dart:ui ( Web ) 也受 Flutter Native 的布局約束,如何打破這樣的約束,是解決滾動(dòng)性能問題的關(guān)鍵。
          • 頁(yè)面加載性能優(yōu)化: 當(dāng)前的頁(yè)面加載性能仍有較大優(yōu)化空間,需要對(duì) Flutter 進(jìn)行編譯干預(yù)與優(yōu)化(如按需分離 main.dart.js),減小資源包大小,有效提升頁(yè)面加載性能。
          • Flutter Web 基建:完善并優(yōu)化開發(fā)、調(diào)試、編譯、構(gòu)建、部署鏈路,使得新老項(xiàng)目能快速接入 Flutter Web。
          • Flutter Web 在 PC 側(cè)的復(fù)用:與 UED 團(tuán)隊(duì)共同制訂 PC 與 App 適配規(guī)范,同時(shí)基于 Dart2js 和 dart:ui (Web)的強(qiáng)大能力,實(shí)現(xiàn)邏輯的抽象,完成組件、模塊的適配,達(dá)到提效最大化;
          • 跟進(jìn) Flutter 官方動(dòng)向:Flutter 2.0 的發(fā)布,穩(wěn)定了對(duì) Web 的支持,同時(shí)默認(rèn)采用 Canvaskit 編譯模式,此模式下對(duì)頁(yè)面滾動(dòng)性能有較大提升。但由于 canvaskit.wasm 文件過于龐大(2.5M),降低了加載性能,因此目前仍不建議在 Web 側(cè)直接使用 Canvaskit。不過官方承諾會(huì)在 2021 年對(duì)性能進(jìn)行整體優(yōu)化,還是值得期待的,我們也將保持跟進(jìn)和溝通。

          我們會(huì)持續(xù)基于 Flutter Web 做更多的探索和嘗試。如果您對(duì) Flutter Web 也感興趣,歡迎大家在文末評(píng)論區(qū)留言或者給出建議,非常感謝。

          版權(quán)聲明

          本文系美團(tuán)技術(shù)團(tuán)隊(duì)出品,著作權(quán)歸屬美團(tuán)。歡迎出于分享和交流等非商業(yè)目的轉(zhuǎn)載或使用本文內(nèi)容,敬請(qǐng)注明“內(nèi)容轉(zhuǎn)載自美團(tuán)技術(shù)團(tuán)隊(duì)”。本文未經(jīng)許可,不得進(jìn)行商業(yè)性轉(zhuǎn)載或者使用。任何商用行為,請(qǐng)發(fā)送郵件至tech@meituan.com申請(qǐng)授權(quán)。

          去3年,當(dāng)我們談?wù)撘咔榈耐瑫r(shí),有一個(gè)話題始終繞不開:

          經(jīng)濟(jì)。

          沒有人想感染病毒,但問題是,病毒突起,不得不防。而疫情防控使得一些社會(huì)經(jīng)濟(jì)活動(dòng)暫停,勢(shì)必會(huì)對(duì)經(jīng)濟(jì)造成影響。兩難之間只能不斷找尋政策最佳發(fā)力點(diǎn)。

          過去3年,中國(guó)經(jīng)濟(jì)不容易,每一個(gè)中國(guó)人都不容易,有不同的困惑與擔(dān)憂也自然難免。

          從這三個(gè)維度出發(fā),能看清明年的經(jīng)濟(jì)形勢(shì)。

          不少人都說,大環(huán)境會(huì)影響個(gè)體的發(fā)展。同樣,中國(guó)經(jīng)濟(jì),也受制于大環(huán)境。

          2022年,全球經(jīng)濟(jì)怎么樣?

          通脹處于幾十年來(lái)最高水平;

          增長(zhǎng)處于自1970年衰退后復(fù)蘇以來(lái)的最嚴(yán)重下滑;

          全球消費(fèi)者信心下降幅度遠(yuǎn)超前幾次全球經(jīng)濟(jì)衰退前的降幅。

          即便已經(jīng)如此,但最糟糕的情況還未到來(lái)——國(guó)際貨幣基金組織(IMF)發(fā)出警告,很多人將在2023年感受到經(jīng)濟(jì)衰退。言下之意,2022年,只是經(jīng)濟(jì)衰退的邊緣,2023年,有可能才是經(jīng)濟(jì)衰退的開始。

          全球更嚴(yán)峻的情況,可能還在后面。

          中國(guó)出口行業(yè),已經(jīng)感受到了寒氣。最新的數(shù)據(jù)顯示,11月我國(guó)出口同比下降8.7%。

          大家都知道,在過去幾年里,中國(guó)的出口“一枝獨(dú)秀”,對(duì)整個(gè)經(jīng)濟(jì)大盤起到了非常難得的支撐作用。但從最新的數(shù)據(jù)來(lái)看,出口也開始出現(xiàn)了比較大的隱憂。

          大環(huán)境不景氣的影響,會(huì)直接體現(xiàn)在今年中國(guó)國(guó)內(nèi)生產(chǎn)總值(GDP)的增速上。

          但實(shí)際上,回過頭看過去,中國(guó)一路發(fā)展過來(lái),周圍的大環(huán)境本就不都是順風(fēng)順?biāo)?/p>

          國(guó)際貨幣基金組織的官方報(bào)告將人均GDP下降的程度視為衡量世界經(jīng)濟(jì)衰退的指標(biāo),這是2008年以來(lái)世界人均GDP的走勢(shì)圖:

          可以發(fā)現(xiàn),2008年后,世界經(jīng)濟(jì)有過三次明顯的衰退期。最近的一次,就是新冠肺炎疫情暴發(fā)后。我們,也正在親身經(jīng)歷著。

          從圖上也可以看出,此次疫情引發(fā)的衰退,還沒有超過此前兩次衰退的程度。

          2008年,世界各國(guó)平均通脹率上升至10年來(lái)的新高。世界GDP增長(zhǎng)率也從2007年的4.5%變成了2009年的-1.3%。

          更重要的是,這場(chǎng)由美國(guó)引發(fā)、蔓延全球的經(jīng)濟(jì)危機(jī)讓中國(guó)人明白了防范金融風(fēng)險(xiǎn)的重要性。

          2014年的衰退,同樣嚴(yán)重——2014年到2016年,世界GDP增長(zhǎng)率出現(xiàn)下滑:

          ||2014年世界GDP增長(zhǎng)率為3.1%;

          2015年世界GDP增長(zhǎng)率為3.1%;

          2016年世界GDP增長(zhǎng)率為2.8%。

          與此同時(shí),中國(guó)經(jīng)濟(jì)仍穩(wěn)住了自己的節(jié)奏,可以看一組數(shù)據(jù):

          2013年至2021年,我國(guó)國(guó)內(nèi)生產(chǎn)總值(GDP)年均增長(zhǎng)6.6%,高于同期世界2.6%和發(fā)展中經(jīng)濟(jì)體3.7%的平均增長(zhǎng)水平。

          這期間,中國(guó)人均GDP從6000多美元上升至超過12000美元,世界排名提升了幾十名。

          大環(huán)境時(shí)有波動(dòng),但是我們都闖過來(lái)了,而且是以可控的較小代價(jià)。

          讓我們來(lái)算筆賬,會(huì)更加直觀:

          2013年,全球GDP總量為77.61萬(wàn)億美元,2021年,全球GDP總量為96.1萬(wàn)億美元。近10年間,全球GDP總量增長(zhǎng)了18.49萬(wàn)億美元。

          這18.49萬(wàn)億美元中,中國(guó)增長(zhǎng)了8.16萬(wàn)億美元,占比44%。

          其實(shí),一路走來(lái),我們周遭的驚濤駭浪從未缺席過。中國(guó)勇于開頂風(fēng)船,善于在惡劣的環(huán)境中化危機(jī)為機(jī)遇。但風(fēng)險(xiǎn)與挑戰(zhàn),一波接著一波,一浪高過一浪。

          2018年,美國(guó)對(duì)中國(guó)發(fā)起貿(mào)易戰(zhàn)。

          貿(mào)易戰(zhàn)一開始,和今天一樣,不少人都對(duì)中國(guó)經(jīng)濟(jì)的前景產(chǎn)生擔(dān)憂,極個(gè)別人甚至說出“現(xiàn)在向美國(guó)投降是代價(jià)最小的”論調(diào)。

          此后,美國(guó)政府鼓吹“脫鉤”“斷鏈”,在各個(gè)層面圍堵中國(guó)。

          現(xiàn)在,四年過去了。結(jié)果如何,大家心里都清楚:

          中美貿(mào)易額不降反增,中美雙邊貨物貿(mào)易總額由2018年的6335.2億美元上升到2021年的7556.45億美元。

          中國(guó)與美國(guó)發(fā)展差距不斷縮小,GDP總量差值由2018年的6.69萬(wàn)億美元,縮小到2021年的5.26萬(wàn)億美元。

          就在不久前,世界貿(mào)易組織(WTO)發(fā)布報(bào)告,裁定2018年美國(guó)對(duì)進(jìn)口鋼鐵和鋁產(chǎn)品加征關(guān)稅的措施違反了世貿(mào)組織相關(guān)規(guī)定。這意味著,中美貿(mào)易戰(zhàn),我們不僅贏于力,更贏于理。

          所以,無(wú)論是全球經(jīng)濟(jì)發(fā)展過程中的階段性、周期性的問題,還是由某些國(guó)家想要發(fā)起的逆全球化的趨勢(shì),我們都經(jīng)歷過,現(xiàn)在回頭看,我們讓很多人的唱衰不斷破產(chǎn)。

          眼下,大家對(duì)于困難的感受更為真切,對(duì)于復(fù)蘇的疑問更多,也很正常——環(huán)境勢(shì)必對(duì)我們有影響。

          但環(huán)境,并不決定我們的去留,行動(dòng)的主動(dòng)權(quán),在我們手里。

          還記不記得這張圖:

          這是2020年,中國(guó)經(jīng)濟(jì)的折線圖。這樣的反彈,我們剛剛經(jīng)歷過。

          在中國(guó)疫情防控措施優(yōu)化后,美國(guó)投行摩根大通上調(diào)了中國(guó)明年的經(jīng)濟(jì)增長(zhǎng)幅度,上調(diào)原因是,中國(guó)經(jīng)濟(jì)復(fù)蘇的大門已經(jīng)打開。與此同時(shí),高盛、普華永道等機(jī)構(gòu)都表示了對(duì)2023年中國(guó)經(jīng)濟(jì)的看好。

          剛剛閉幕的中央經(jīng)濟(jì)工作會(huì)議所傳遞出的信號(hào)也更加強(qiáng)烈。這兩天,中央財(cái)經(jīng)委員會(huì)辦公室分管日常工作的副主任韓文秀給出了更加明確的判斷:綜合研判,明年世界經(jīng)濟(jì)增速可能會(huì)明顯下滑,而我國(guó)經(jīng)濟(jì)可能會(huì)總體回升,從而形成一個(gè)獨(dú)立的向上運(yùn)行的軌跡。

          當(dāng)然,過去的經(jīng)驗(yàn)?zāi)0鍩o(wú)法原封不動(dòng)地套用到現(xiàn)在。

          特別是我們?cè)谡務(wù)撝袊?guó)經(jīng)濟(jì)預(yù)期這樣宏大的話題時(shí),對(duì)一些現(xiàn)實(shí)正在發(fā)生的具體問題同樣要給出答案,看中國(guó)經(jīng)濟(jì),同樣要關(guān)照當(dāng)下。

          比如說,前不久的快遞運(yùn)力問題成為大家關(guān)注的焦點(diǎn),不少人就發(fā)出疑問,快遞都送不了,中國(guó)經(jīng)濟(jì)真的能復(fù)蘇嗎?

          但讓大家沒想到的是,短短幾天,運(yùn)力不足的問題就得到了緩解。

          原因很簡(jiǎn)單,快遞運(yùn)力不足,只是人手不夠,是“沒米下鍋”,運(yùn)力調(diào)度也只是技術(shù)問題,而基礎(chǔ)設(shè)施等硬件的那個(gè)“鍋”,我們一直在提前布局不斷完善。隨著運(yùn)力補(bǔ)充,這個(gè)問題也就不再困擾大家。

          快遞小哥的背后,連接著互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、云計(jì)算、大數(shù)據(jù)、5G、智慧物流等。這些詞,除了體現(xiàn)在“江浙滬包郵”的日常生活,也在深刻改變著中國(guó)經(jīng)濟(jì)的格局。

          △你可能想不到,每當(dāng)你點(diǎn)一次外賣,會(huì)牽動(dòng)至少106個(gè)產(chǎn)業(yè)

          問題快速解決是過去5年、10年甚至十幾年間,這些技術(shù)在中國(guó)不同的區(qū)域落地生根的結(jié)果。幅員遼闊的中國(guó)給這些技術(shù)提供了相當(dāng)豐富和充足的應(yīng)用場(chǎng)景,使得它們能夠以全球其他地區(qū)難以企及的速度不斷地運(yùn)行、升級(jí)、優(yōu)化。

          這反映的是中國(guó)發(fā)展的縱深感。隨著疫情防控政策的調(diào)整變化,國(guó)內(nèi)不同省份、不同城市的放開節(jié)奏是梯次的、漸進(jìn)的。也就是說,供應(yīng)鏈的韌性能夠讓我們高效調(diào)動(dòng)積累的資源去解決一些焦點(diǎn)問題,只要拉開節(jié)奏和間隙,這樣集中力量解決問題的方式也將使得我們更快地走向復(fù)蘇。

          這是中國(guó)供應(yīng)鏈的韌性,這種韌性,也在給中國(guó)產(chǎn)業(yè)復(fù)蘇,提供很強(qiáng)的支撐力。

          最近,很多人都關(guān)注到了多個(gè)省份包機(jī)出海的事情。

          江蘇有一家企業(yè)去了南非。在南非,這家企業(yè)考察了當(dāng)?shù)氐牡V山、倉(cāng)庫(kù)和港口,最終做出了積極布局南非市場(chǎng)的決定,簽署了訂單。

          企業(yè)出海拓展市場(chǎng),肯定要解決要素跨越物理空間移動(dòng)的問題,基礎(chǔ)設(shè)施的聯(lián)通和供應(yīng)鏈就至關(guān)重要。

          值得一提的是,這家企業(yè)在多年前就考察過南非市場(chǎng)。顯然,那時(shí)候深入南非的時(shí)機(jī)還沒有那么成熟,尤其是基礎(chǔ)設(shè)施的聯(lián)通今非昔比——這家企業(yè)參觀的南非德班港,是金磚國(guó)家新開發(fā)銀行參與改造的項(xiàng)目。

          過去這些年,有很多像南非這樣的國(guó)家,在共建“一帶一路”的過程中,不僅改善了自身的基礎(chǔ)設(shè)施,贏得了更多的發(fā)展機(jī)遇。在與中國(guó)企業(yè)的交往過程中,彼此加深了解,拓展了雙方的發(fā)展空間。

          企業(yè),在拓展著各自的半徑。半徑的延伸,就是新的機(jī)會(huì)。

          通過對(duì)公開數(shù)據(jù)的挖掘,我們發(fā)現(xiàn),在“新十條”發(fā)布后,有至少23個(gè)省市出臺(tái)了支持企業(yè)境外拓展市場(chǎng)的政策。

          要看到,支撐經(jīng)濟(jì)發(fā)展的基礎(chǔ)條件并沒有改變,一個(gè)強(qiáng)大的供應(yīng)網(wǎng)絡(luò)一直都在,當(dāng)產(chǎn)業(yè)活力亟待重新激發(fā)的時(shí)候,中國(guó)經(jīng)濟(jì)也將迸發(fā)出強(qiáng)大的動(dòng)力。

          幾天前,中央經(jīng)濟(jì)工作會(huì)議召開,為2023年的經(jīng)濟(jì)發(fā)展定調(diào)。

          會(huì)議閉幕后,很多解讀和分析紛紛出爐,討論明年中國(guó)經(jīng)濟(jì)“怎么干”的問題。其中關(guān)注的一個(gè)焦點(diǎn)是擴(kuò)大國(guó)內(nèi)需求。因?yàn)槲屙?xiàng)重點(diǎn)工作任務(wù),第一項(xiàng)就是著力擴(kuò)大國(guó)內(nèi)需求,同時(shí)提到要把恢復(fù)和擴(kuò)大消費(fèi)擺在優(yōu)先位置。

          很多人看到后感到不理解,現(xiàn)在疫情的高峰還沒到來(lái),很多人都不愿意出門消費(fèi)。恢復(fù)和擴(kuò)大消費(fèi)擺在優(yōu)先位置,可行嗎?靠刺激消費(fèi)來(lái)擴(kuò)大國(guó)內(nèi)需求,靠譜嗎?

          不知道各位有沒有注意到另一句話:

          大力提振市場(chǎng)信心,把實(shí)施擴(kuò)大內(nèi)需戰(zhàn)略同深化供給側(cè)結(jié)構(gòu)性改革有機(jī)結(jié)合起來(lái)。

          供給側(cè)結(jié)構(gòu)性改革,這個(gè)詞,對(duì)于跟蹤關(guān)注中國(guó)經(jīng)濟(jì)的人來(lái)說肯定不陌生。供給側(cè)結(jié)構(gòu)性改革的核心在于全要素生產(chǎn)率,也就是要素投入轉(zhuǎn)化成產(chǎn)出的總體效率。我們要以供給側(cè)結(jié)構(gòu)性改革為主線,推動(dòng)經(jīng)濟(jì)發(fā)展質(zhì)量變革、效率變革、動(dòng)力變革,才能不斷增強(qiáng)我國(guó)經(jīng)濟(jì)創(chuàng)新力和競(jìng)爭(zhēng)力。

          可見,與深化供給側(cè)結(jié)構(gòu)性改革相結(jié)合的擴(kuò)大內(nèi)需,并不是簡(jiǎn)單地刺激消費(fèi),而是以新的供給、新的創(chuàng)新作為撬動(dòng)內(nèi)需和提升消費(fèi)的抓手。

          舉個(gè)簡(jiǎn)單的例子,在蘋果手機(jī)出現(xiàn)前,絕大多數(shù)手機(jī)都是有鍵盤的,但蘋果手機(jī)用自己新的供給創(chuàng)造出觸摸屏手機(jī)這樣一個(gè)廣闊的市場(chǎng)。蘋果手機(jī)用持續(xù)的技術(shù)創(chuàng)新,滿足甚至引導(dǎo)了新的消費(fèi)需求,這就是供給側(cè)結(jié)構(gòu)性改革。

          此次中央經(jīng)濟(jì)工作會(huì)議上,支持住房改善、新能源汽車、養(yǎng)老服務(wù)等被列為明年消費(fèi)重點(diǎn)。這三個(gè)領(lǐng)域尤其是后兩個(gè)領(lǐng)域,因?yàn)楣┙o端的生產(chǎn)能力和產(chǎn)品品質(zhì)的提升,拓展消費(fèi)空間,想必很多人已經(jīng)感同身受。

          以新能源車為例,新能源汽車不僅在國(guó)內(nèi)消費(fèi)領(lǐng)域風(fēng)生水起,今年前10個(gè)月,出口達(dá)到了49.9萬(wàn)輛,同比增長(zhǎng)96.7%。

          這個(gè)數(shù)字是怎么來(lái)的?正是汽車行業(yè)抓住了高質(zhì)量發(fā)展的窗口期,成為中國(guó)智能制造的一支“生力軍”。2021年,中國(guó)新能源汽車出口超過40萬(wàn)輛,同比增長(zhǎng)近3倍,歐洲已經(jīng)成為一個(gè)主要市場(chǎng)。

          更重要的是,和當(dāng)?shù)仄嚻放频母?jìng)爭(zhēng),將加快國(guó)產(chǎn)新能源汽車的升級(jí)優(yōu)化。比如,更有針對(duì)性的定制化生產(chǎn)服務(wù),使得“柔性化”生產(chǎn)發(fā)展更加深入新能源車領(lǐng)域,反過來(lái)也為國(guó)內(nèi)創(chuàng)造新的消費(fèi)場(chǎng)景,讓中國(guó)消費(fèi)者享受到更加質(zhì)優(yōu)價(jià)廉的產(chǎn)品。

          這兩天,全國(guó)政協(xié)經(jīng)濟(jì)委員會(huì)副主任寧吉喆在分析明年形勢(shì)時(shí)也明確指出,明年要繼續(xù)支持線上線下商品消費(fèi)融合發(fā)展,發(fā)展智慧超市、智慧商店、智慧餐廳等新零售業(yè)態(tài),培育互聯(lián)網(wǎng)+社會(huì)數(shù)字、數(shù)字+生活服務(wù)新模式,發(fā)展智慧家庭、智慧康養(yǎng)、智慧旅游、智慧出行、智慧廣電、智慧體育等新型數(shù)字消費(fèi)業(yè)態(tài)。促進(jìn)共享經(jīng)濟(jì)等消費(fèi)新業(yè)態(tài)發(fā)展,支持社交電商、網(wǎng)絡(luò)直播等新個(gè)體經(jīng)濟(jì)模式發(fā)展。

          這些無(wú)疑是中國(guó)經(jīng)濟(jì)提前布局?jǐn)?shù)字經(jīng)濟(jì),新供給拓展新需求的好案例。

          供給側(cè)結(jié)構(gòu)性改革歸根到底是一場(chǎng)改革。這場(chǎng)改革會(huì)助力中國(guó)經(jīng)濟(jì)復(fù)蘇從過去外延式擴(kuò)張真正向內(nèi)涵式發(fā)展轉(zhuǎn)變,推動(dòng)中國(guó)經(jīng)濟(jì)實(shí)現(xiàn)質(zhì)量變革、效率變革和動(dòng)力變革。深化供給側(cè)結(jié)構(gòu)性改革相結(jié)合的擴(kuò)大內(nèi)需,解決的不僅是中國(guó)經(jīng)濟(jì)短期復(fù)蘇的問題,更為中國(guó)經(jīng)濟(jì)高質(zhì)量發(fā)展奠定堅(jiān)實(shí)基礎(chǔ)。

          改革考驗(yàn)的是智慧、勇氣和行動(dòng)力。

          △通過對(duì)公開數(shù)據(jù)的挖掘我們發(fā)現(xiàn),12月7日“新十條”發(fā)布后,多地就立即采取行動(dòng),優(yōu)化疫情防控措施

          眼下,隨著各地新一輪防控政策調(diào)整到位,短期內(nèi)可能還會(huì)有一波疫情壓力。但是正如中央經(jīng)濟(jì)工作會(huì)議中提出的:加強(qiáng)統(tǒng)籌銜接,有序組織實(shí)施,順利渡過流行期,確保平穩(wěn)轉(zhuǎn)段和社會(huì)秩序穩(wěn)定。

          人民對(duì)美好生活的向往不變,中國(guó)深化改革,邁向高質(zhì)量發(fā)展的步伐也不會(huì)停。

          我們國(guó)家有9億勞動(dòng)年齡人口,這9億人,每天會(huì)出門賺錢,都在為生計(jì)奔波。他們是爸爸或是媽媽,是兒子或者女兒,每個(gè)人,都渴望更好的生活。

          每個(gè)人的愿望都微不足道,但匯集起來(lái),就是推動(dòng)這個(gè)國(guó)家不斷向前的不竭動(dòng)力。

          只要14億多中國(guó)人在努力,中國(guó)經(jīng)濟(jì)就有動(dòng)力,誰(shuí)也不會(huì)失掉對(duì)中國(guó)經(jīng)濟(jì)的信心。

          來(lái)源: 玉淵譚天

          作烘焙面包蛋糕小程序的前期準(zhǔn)備

          在制作烘焙面包小程序的前期準(zhǔn)備階段,需要通過系統(tǒng)性的業(yè)務(wù)調(diào)研,全面收集并分析了市場(chǎng)需求與潛在客戶的期望。通過在線問卷、用戶訪談和社交媒體分析等多種方式,深入洞察了烘焙愛好者的行為偏好、學(xué)習(xí)需求以及使用習(xí)慣,為小程序的功能設(shè)計(jì)和內(nèi)容規(guī)劃提供了堅(jiān)實(shí)的數(shù)據(jù)支撐。

          針對(duì)收集到的客戶需求進(jìn)行了細(xì)致的分類和整理,確定了小程序的核心功能,旨在為用戶打造一個(gè)全方位、多功能的烘焙小程序商城。在主題設(shè)計(jì)上,需要結(jié)合烘焙文化的特色與現(xiàn)代審美趨勢(shì),明確小程序的視覺風(fēng)格和界面布局。通過色彩搭配、圖標(biāo)設(shè)計(jì)和頁(yè)面排版等細(xì)節(jié)處理,力求為用戶帶來(lái)溫馨、專業(yè)的使用體驗(yàn)。同時(shí)還需要注重了小程序的用戶友好性,通過優(yōu)化操作流程、簡(jiǎn)化交互設(shè)計(jì)等方式,降低用戶的學(xué)習(xí)成本,提高使用效率。

          為什么你的企業(yè)需要制作烘焙面包小程序?

          企業(yè)為何需要制作烘焙面包小程序,原因顯而易見且充滿戰(zhàn)略意義。首先,烘焙面包小程序能夠?yàn)槠髽I(yè)提供一個(gè)直接觸達(dá)消費(fèi)者的渠道,通過個(gè)性化推薦、會(huì)員優(yōu)惠等功能,增強(qiáng)用戶粘性和忠誠(chéng)度。其次,小程序具備輕便、快捷的特點(diǎn),用戶無(wú)需下載安裝即可使用,極大提升了用戶體驗(yàn)和便利性。此外,烘焙面包小程序還可以幫助企業(yè)精準(zhǔn)把握市場(chǎng)脈搏,通過收集用戶數(shù)據(jù),深入分析消費(fèi)趨勢(shì),從而制定更加有效的營(yíng)銷策略。

          烘焙面包小程序能夠?yàn)槠髽I(yè)創(chuàng)造新的增長(zhǎng)點(diǎn)。通過線上商城功能,企業(yè)可以拓展銷售渠道,實(shí)現(xiàn)線上線下融合,提高銷售額。同時(shí),小程序還支持社交分享功能,用戶可以將喜歡的烘焙產(chǎn)品分享給朋友,進(jìn)一步擴(kuò)大品牌影響力。

          烘焙面包小程序不僅能夠幫助企業(yè)提升用戶體驗(yàn)、增強(qiáng)用戶粘性,還能為企業(yè)創(chuàng)造新的增長(zhǎng)點(diǎn),拓展銷售渠道,提高品牌影響力。因此,對(duì)于烘焙行業(yè)的企業(yè)來(lái)說,制作烘焙面包小程序是順應(yīng)市場(chǎng)趨勢(shì)、實(shí)現(xiàn)持續(xù)發(fā)展的重要舉措。

          使用模板制作烘焙面包小程序的好處?

          使用模板制作烘焙面包小程序,帶來(lái)了諸多顯著的好處。首先,模板提供了標(biāo)準(zhǔn)化的設(shè)計(jì)和功能框架,使得小程序開發(fā)過程更加高效和便捷。企業(yè)無(wú)需從零開始設(shè)計(jì),而是可以直接基于模板進(jìn)行定制和優(yōu)化,大大縮短了開發(fā)周期,降低了開發(fā)成本。

          模板小程序通常經(jīng)過精心設(shè)計(jì)和測(cè)試,具備良好的用戶體驗(yàn)和穩(wěn)定性。這意味著使用模板制作的小程序不僅外觀精美,而且運(yùn)行流暢,能夠?yàn)橛脩籼峁└觾?yōu)質(zhì)的烘焙學(xué)習(xí)和購(gòu)物體驗(yàn)。

          模板制作的小程序還具備高度的可擴(kuò)展性和靈活性。企業(yè)可以根據(jù)自身需求,輕松添加或刪除功能模塊,滿足不斷變化的業(yè)務(wù)需求。同時(shí),模板還支持多種自定義設(shè)置,企業(yè)可以根據(jù)品牌形象和市場(chǎng)定位,調(diào)整小程序的色彩、字體和圖標(biāo)等元素,打造出獨(dú)具特色的小程序。

          使用模板制作烘焙面包小程序還能夠降低企業(yè)的技術(shù)門檻。企業(yè)無(wú)需具備專業(yè)的技術(shù)團(tuán)隊(duì),也能夠快速搭建出功能齊全、穩(wěn)定可靠的小程序,實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。

          能夠?yàn)槠髽I(yè)帶來(lái)高效、穩(wěn)定、靈活和易用的開發(fā)體驗(yàn),是企業(yè)快速搭建烘焙小程序、實(shí)現(xiàn)數(shù)字化轉(zhuǎn)型的明智之選。

          從零開始制作烘焙面包小程序商城

          借助先進(jìn)的小程序制作工具,打造烘焙面包小程序商城變得輕而易舉。快速搭建,最快一天內(nèi)即可上線運(yùn)營(yíng),遠(yuǎn)超傳統(tǒng)建站方式的速度與便捷。無(wú)需具備深厚的技術(shù)背景,無(wú)需聘請(qǐng)專業(yè)程序員,僅需簡(jiǎn)單的在線操作,就如同編輯PPT一般輕松。這不僅是對(duì)烘焙愛好者的一次技術(shù)革新,更是為企業(yè)提供了高效、靈活的線上銷售新渠道。

          step1,在「易極贊」的小程序模板中,選中烘焙面包小程序模板,一鍵即可生成發(fā)布自己的品牌小程序

          step2,一鍵生成烘焙面包小程序,進(jìn)入可視化編輯器可以對(duì)站點(diǎn)文案圖片進(jìn)行修改

          step3,在線編輯修改站點(diǎn)內(nèi)容,設(shè)計(jì)完成后,點(diǎn)擊發(fā)布這樣一個(gè)烘焙面包小程序就制作完成了

          烘焙面包小程序主題模板展示

          烘焙面包小程序已成為品牌與消費(fèi)者間不可或缺的溝通橋梁。在烘焙行業(yè),一個(gè)功能全面、設(shè)計(jì)精致的小程序,不僅能展現(xiàn)品牌的獨(dú)特魅力,更能有效吸引并穩(wěn)固忠實(shí)的用戶群體。想要迅速搭建這樣一款小程序?無(wú)需從零開始,只需借助成熟的小程序模板,通過簡(jiǎn)單的定制與調(diào)整,即可輕松實(shí)現(xiàn)。這不僅節(jié)省了大量時(shí)間與成本,更讓品牌快速融入數(shù)字化時(shí)代,與消費(fèi)者建立更緊密的聯(lián)系。

          易極贊提供超80套小程序模板案例,開箱即用,在線編輯

          制作一個(gè)烘焙面包小程序需要多少錢

          對(duì)于想要進(jìn)軍烘焙行業(yè)的創(chuàng)業(yè)者來(lái)說,制作一款烘焙面包小程序可能是一個(gè)令人興奮但又有些疑慮的決策。擔(dān)心高昂的開發(fā)成本和復(fù)雜的技術(shù)門檻嗎?其實(shí),隨著小程序開發(fā)工具的不斷發(fā)展,制作一款烘焙面包小程序已經(jīng)變得既簡(jiǎn)單又經(jīng)濟(jì)。

          無(wú)需專業(yè)的編程或設(shè)計(jì)背景,只需選擇一款與烘焙行業(yè)相契合的小程序模板,借助這些工具,你可以快速搭建起你的烘焙面包小程序框架。接著,通過簡(jiǎn)單的操作,你可以自定義上傳圖片、調(diào)整文案,輕松實(shí)現(xiàn)小程序的個(gè)性化設(shè)置。與傳統(tǒng)的開發(fā)方式相比,使用小程序開發(fā)工具不僅降低了技術(shù)門檻,還大大節(jié)省了開發(fā)成本。

          更值得一提的是,這些小程序開發(fā)工具通常提供一站式的服務(wù),包括小程序的托管、安全、備份和性能優(yōu)化等。你無(wú)需為服務(wù)器和帶寬支付額外費(fèi)用,也無(wú)需雇傭?qū)I(yè)技術(shù)人員進(jìn)行小程序的日常維護(hù)和更新。這讓你能夠?qū)W⒂诤姹好姘难邪l(fā)和銷售,而無(wú)需為小程序的運(yùn)營(yíng)而分心。因此,烘焙面包小程序不僅是一個(gè)展示產(chǎn)品的平臺(tái),更是一個(gè)降低成本、提高效率、助力業(yè)務(wù)發(fā)展的得力助手。

          如何推廣烘焙面包小程序

          推廣烘焙面包小程序時(shí),首要任務(wù)是明確我們的目標(biāo)用戶群體,并深入探究他們的烘焙需求和口味偏好。通過細(xì)致的市場(chǎng)調(diào)研和數(shù)據(jù)分析,我們能夠精準(zhǔn)地鎖定潛在用戶,并量身定制出有效的推廣策略。我們可以充分利用微信生態(tài)內(nèi)的資源,如微信公眾號(hào)、微信朋友圈等,發(fā)布有關(guān)烘焙面包小程序的精彩文章、圖文消息和誘人視頻,吸引用戶點(diǎn)擊并體驗(yàn)。同時(shí),與行業(yè)內(nèi)的意見領(lǐng)袖、網(wǎng)紅或烘焙專家合作,邀請(qǐng)他們體驗(yàn)并推薦我們的小程序,將能迅速提升小程序的知名度和影響力。

          除了線上推廣,我們也不能忽視線下渠道的潛力。在實(shí)體烘焙店鋪內(nèi)張貼小程序二維碼,鼓勵(lì)顧客掃碼下單或獲取優(yōu)惠;在烘焙課程或活動(dòng)中設(shè)置小程序互動(dòng)環(huán)節(jié),增強(qiáng)用戶參與感和粘性。此外,我們還需注重用戶體驗(yàn)和口碑傳播。不斷優(yōu)化小程序的功能和界面設(shè)計(jì),確保用戶在使用時(shí)能夠享受到流暢、便捷的體驗(yàn)。同時(shí),積極收集用戶反饋,持續(xù)改進(jìn)和完善小程序,提高用戶滿意度和忠誠(chéng)度。設(shè)置分享獎(jiǎng)勵(lì)機(jī)制,鼓勵(lì)用戶將小程序分享給親朋好友,形成口碑傳播效應(yīng)。

          與合作伙伴建立緊密的合作關(guān)系,共同推廣烘焙面包小程序。與電商平臺(tái)攜手,將小程序嵌入到商品詳情頁(yè)或購(gòu)物車中,方便用戶直接購(gòu)買;與線下商家合作,提供優(yōu)惠券或積分兌換等福利,吸引用戶到店體驗(yàn)。通過多方合作,共同拓展市場(chǎng)份額,讓烘焙面包小程序成為烘焙愛好者們的首選平臺(tái)。

          原文出自易極贊

          https://www.yjzan.com/yjznews/fc0afdd5.html


          主站蜘蛛池模板: 国产中的精品一区的| 一区二区亚洲精品精华液| 精品日产一区二区三区手机| 亚洲国产情侣一区二区三区| 无码人妻精品一区二区三区不卡| 日本中文一区二区三区亚洲| 精品福利一区二区三区免费视频 | 日本在线不卡一区| 日韩电影在线观看第一区| 国产福利无码一区在线| 亚洲一区二区三区深夜天堂| 无码AV中文一区二区三区| 在线精品动漫一区二区无广告| 日韩毛片一区视频免费| 国产伦精品一区二区三区四区| 中文无码一区二区不卡αv| 亚洲一区二区电影| 精品欧洲av无码一区二区| 亚洲国产视频一区| 2018高清国产一区二区三区| 天堂国产一区二区三区| 一区二区三区在线|欧| 亚洲一区二区三区高清| 亚洲综合在线成人一区| 亚洲国产成人精品无码一区二区| 亚洲一区二区三区91| 国产成人精品日本亚洲专一区 | 国产小仙女视频一区二区三区| 亚洲福利秒拍一区二区| 亚洲av色香蕉一区二区三区蜜桃 | 成人精品视频一区二区三区| 一区二区三区波多野结衣| 波多野结衣中文字幕一区二区三区| 在线成人综合色一区| 精品人妻一区二区三区四区 | 风流老熟女一区二区三区| 亚洲AⅤ视频一区二区三区| 色老板在线视频一区二区| 国产一区二区免费| 2021国产精品视频一区| 午夜视频一区二区|