DartVM服務器開發(fā)(第二十七天)--熱重載(解密熱重載)

大家好奥喻,今天我們來學習一下服務器如何熱重載,關于熱重載這個特性,只要是運行在DartVM下都可以實現(xiàn)熱重載蹦魔,嗯嗯激率,這樣說,大家應該能明白Flutter為什么能夠熱重載了吧勿决,F(xiàn)lutter實際也是運行在一個DartVM的環(huán)境之下,下次我會介紹快照乒躺,好了,我們來開始學習服務器熱重載吧低缩!

1.介紹

熱重載其實就是將一個文件加入到監(jiān)聽中嘉冒,如果有改變,就會對程序進行更新表制,我們可以集成jaguar_hotreload這個包,添加之后控乾,就可以實現(xiàn)無需重啟服務器進行更新了

2. 使用熱重載

  • 添加依賴
    在我們的pubspec.yaml文件下添加下面代碼

    dependencies:
      jaguar_hotreload: ^2.0.2
    
  • 執(zhí)行pub get命令

    image.png

  • 導包

    import 'package:jaguar_hotreload/jaguar_hotreload.dart';
    
  • 添加熱重載

    main(){
     final reloader = HotReloader(debounceInterval: const Duration(seconds: 10),
                  vmServiceUrl: 'ws://localhost:8181/ws');
    reloader.addPackageDependencies();
    reloader.addGlob(Glob('jaguar_*/lib'));
    reloader.addFile(File('pubspec.yaml'));
    reloader.addPackagePath(Uri(scheme: 'package', path: 'jaguar/'));
    reloader.addUri(new Uri(scheme: 'file', path: '/usr/lib/dart'));
    reloader.addPath('lib/');
    await reloader.go();
    }
    
    • debounceInterval 用于更新間隔么介,如果在間隔內(nèi)更新,會等待下一次才更新蜕衡,默認為1秒
    • vmServiceUrl 指定一個vm service的地址
    • addPackageDependencies() 監(jiān)聽.packages里面的所有文件
    • addGlob() 使用正則監(jiān)聽
    • addFile ()添加單個文件監(jiān)聽
    • addPackagePath 添加包路徑監(jiān)聽
    • addUri() 使用uri添加監(jiān)聽
    • addPath() 添加監(jiān)聽路徑(運行的.dart文件為跟目錄)
    • go() 執(zhí)行監(jiān)聽
  • 手動觸發(fā)監(jiān)聽
    我們可以調(diào)用reloader.onReload進行手動觸發(fā)監(jiān)聽

  • 注意在運行的時候壤短,我們需要啟用Dart VM服務。
    首先要區(qū)分以下:DartVM虛擬機和DartVM服務慨仿,DartVM服務是在DartVM虛擬機的久脯,正常是不會啟用服務,我們需要使用命令--enable-vm-service 或者 --observe進行啟用镰吆,例如:dart --observe main.dart,所以:實現(xiàn)熱重載需要啟用DartVM服務 這一句比較重點帘撰,先記下
    熱重載的部分代碼:

    /// Reloads the application
    Future<void> reload() async {
      print('Reloading the application...');
    
      // Get vm service
      _client ??= await vmServiceConnectUri(vmServiceUrl);
    
      // Find main isolate id to reload it
      final vm = await _client.getVM();
      final ref = vm.isolates.first;
    
      // Reload
      final rep = await _client.reloadSources(ref.id);
    
      if (!rep.success) throw Exception('Reloading failed! Reason: $rep');
    
      _onReload.add(DateTime.now());
    }
    

3.實例

添加如下代碼:

main() => runService();

runService() async {
  final reloader = HotReloader(debounceInterval: const Duration(seconds: 10));
  reloader.addPath('.');//添加當前項目進行監(jiān)聽
  await reloader.go();

  Jaguar()
    ..get('/', (Context ctx) => 'Hello World')
    ..log.onRecord.listen(print)
    ..serve(logRequests: true);
}

然后我們使用命令行啟用服務器

dart --enable-vm-service bin/main.dart

image.png

然后,我們請求以下服務器
image.png

我們來改一下代碼看看万皿,將Hello World 改為 'Hello Rhyme'

main() => runService();

runService() async {
  final reloader = HotReloader(debounceInterval: const Duration(seconds: 10));
  reloader.addPath('.');
  await reloader.go();

  Jaguar()
//edit
    ..get('/', (Context ctx) => 'Hello Rhyme')
//edit
    ..log.onRecord.listen(print)
    ..serve(logRequests: true);
}

可以看到摧找,控制臺輸出了Reloading the application...

image.png

然后刷新一下頁面
image.png

emmm...出現(xiàn)bug了我們來看看dart-lang的sdk里面的一個wiki,大家應該明白牢硅。
image.png

在DartVM熱重載中蹬耘,只會改變程序的行為,而不能改變程序的狀態(tài),所以我們在定義Jaguar的時候减余,已經(jīng)把(Context ctx) => 'Hello World'這個狀態(tài)定義到堆棧中综苔,再次熱重載的時候,并不會發(fā)生改變位岔,我們再修改一下程序看看

main() => runService();

runService() async {
  final reloader = HotReloader(debounceInterval: const Duration(seconds: 10));
  reloader.addPath('.');
  await reloader.go();

  Jaguar()
//edit
    ..get('/', (Context ctx) => sayhello())
//edit
    ..log.onRecord.listen(print)
    ..serve(logRequests: true);
}
//new
sayhello() => 'Hello World';
//new

我們在這里將字符串搬到一個方法里面如筛,這樣,堆棧只記錄這個方法抒抬,當熱重載的時候妙黍,方法再次被搜索的時候,返回的字符串變了瞧剖,就能實現(xiàn)熱重載
我們重新運行看看

dart --enable-vm-service bin/main.dart
image.png

然后拭嫁,我們請求以下服務器


image.png

我們來改一下這個方法的返回看看


image.png

可以看到可免,我們成功的實現(xiàn)了熱重載。做粤。

OK浇借,我們今天就到這里了,下次有機會再見怕品,如果你在這篇文章中得到收獲妇垢,希望能支持一下作者,給作者一個大大禮包(****** 點亮紅心 ****** **關注******** 轉發(fā) ******) 你的支持肉康,是我創(chuàng)作和分享的動力闯估!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吼和,隨后出現(xiàn)的幾起案子涨薪,更是在濱河造成了極大的恐慌,老刑警劉巖炫乓,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刚夺,死亡現(xiàn)場離奇詭異,居然都是意外死亡末捣,警方通過查閱死者的電腦和手機侠姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箩做,“玉大人莽红,你說我怎么就攤上這事“畎睿” “怎么了船老?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圃酵。 經(jīng)常有香客問我柳畔,道長,這世上最難降的妖魔是什么郭赐? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任薪韩,我火速辦了婚禮,結果婚禮上捌锭,老公的妹妹穿的比我還像新娘俘陷。我一直安慰自己,他們只是感情好观谦,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布拉盾。 她就那樣靜靜地躺著,像睡著了一般豁状。 火紅的嫁衣襯著肌膚如雪捉偏。 梳的紋絲不亂的頭發(fā)上倒得,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音夭禽,去河邊找鬼霞掺。 笑死,一個胖子當著我的面吹牛讹躯,可吹牛的內(nèi)容都是我干的菩彬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼潮梯,長吁一口氣:“原來是場噩夢啊……” “哼骗灶!你這毒婦竟也來了?” 一聲冷哼從身側響起秉馏,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耙旦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沃饶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體母廷,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡轻黑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年糊肤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氓鄙。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡馆揉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抖拦,到底是詐尸還是另有隱情升酣,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布态罪,位于F島的核電站噩茄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏复颈。R本人自食惡果不足惜绩聘,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耗啦。 院中可真熱鬧凿菩,春花似錦、人聲如沸帜讲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽似将。三九已至获黔,卻和暖如春蚀苛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肢执。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工枉阵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人预茄。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓兴溜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耻陕。 傳聞我的和親對象是個殘疾皇子拙徽,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容