FE社區 - 一個基于JavaScript的垂直化前端技術社區https://www.www.wsns.net.cnFE(Front-end)社區是一個基于JavaScript垂直化的前端技術社區,致力于促進Web Developer領域知識與技術創新的分享與交流。zh-cn2021最新慕課所有課程大全https://www.www.wsns.net.cn/topics/176https://www.www.wsns.net.cn/topics/176<div class="markdown-text"><h2>2021最新慕課所有課程大全</h2> <p>課程均為百度網盤鏈接的形式保存下載 mp4格式支持任何設備</p> <p>全網最全it資源 點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a></p> <p>Web前端架構師 廖師兄親授-Java分布式系統解決方案 深度剖析C語言知識體系 原理+實踐,一課帶你吃透C語言 python進階訓練營 JavaEE在線就業班2.0【最新升級版】 算法訓練營 架構師訓練營 JAVA進階訓練營(2021最新版)點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> GO進階訓練營 Vue3 從入門到實戰 進階式掌握完整知識體系 大數據開發工程師移動端架構師【完結】Go開發工程師:迎接上升風口,踏入藍海行業! 人人都能學會數據分析【16周完結】 Java架構師-十項全能 Python全棧工程師2020升級版【完結】 前端工程師-2020版 Java工程師【2020升級版已完結】 Java全棧工程師【已完結】 算法與數據結構體系課【已完結】 體系課-數據可視化入門到精通-打造前端差異化競爭力(已完結) 體系課-Go+Python雙語言混合開發 盯緊技術先機 抓緊高薪機遇【完結】點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> uni-app實戰仿微信app開發 2021必修 首門CSS架構系統精講 理論+實戰玩轉蘑菇街 Java異常與調優一站式解決方案 首門程序員理財課 Python量化交易系統實戰 Spring Boot + Vue3 前后端分離 實戰wiki知識庫系統 Python自動化測試開發實戰 一門能就業的測試課 Flutter高級進階實戰 仿嗶哩嗶哩APP 笑傲Java面試:面霸修煉手冊 Kubernetes 入門到進階實戰點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> React17 系統精講 結合TS打造旅游電商平臺 SpringBoot 在線協同辦公小程序開發 全棧式項目實戰 React17+React Hook+TS4 最佳實踐 仿 Jira 企業級項目 開課吧—web前端全棧開發(2020年最新) 開課吧-Java企業級分布式架構師(2020最新) Kubernetes/K8s架構師實戰集訓營【2020最新】 邁向高級的Java面試突圍課 Android 應用程序構建實戰+原理精講 微信授權掃碼點餐-新特性React16 用 React.js+Egg.js 造輪子 全棧開發旅游電商應用 Spark3大數據實時處理-Streaming+Structured Streaming 實戰 Spring Security + OAuth2 精講 多場景打造企業級認證與授權 新RabbitMQ精講,項目驅動落地,分布式事務拔高 Vue3.0+TS打造企業級組件庫 快速掌握Vue3企業實際應用 Spring Cloud分布式微服務實戰養成應對復雜業務的綜合技術能力 協程原理從入門到精通 每個后端開發都需要掌握的高性能開發技術 Go微服務入門到容器化實踐,落地可觀測的微服務電商項目 極客大學-前端進階訓練營【2020最新版】 算法面試專題課(Java版) 畢設一課通 從開題到答辯高效完成(含全棧項目) Laravel重構企業級電商項目 全面強化職場核心競爭力 高級Redis應用進階課 一站式Redis解決方案點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> PyTorch入門到進階 實戰計算機視覺與自然語言處理項目 1:Java架構師成長直通車 2: java全棧工程師:從java后端到全棧,高級電商全棧系統大課 3:Java工程師 4:算法與數據結構體系課 5:大前端 6:體系課-數據可視化入門到精通-打造前端差異化競爭力 7:Python工程師 8:前端工程師 9:Android工程師 10:.Net Core 開發電商后端API 從0到精通吃透RESTful百度網盤 11:實戰課程 Java企業級支付全家桶設計與實戰 12:從零開始學調優-Java 全技術棧 性能調優 13:ReactNative+TypeScript仿喜馬拉雅開發App 14:JAVA互聯網架構師專題/分布式/高并發/微服務【第三期】點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> 15:微專業-Python爬蟲工程師 - 3個月成為網絡爬蟲工程師 16:(畢設項目)Vue+Go前端后端一體化 企業級微服務網關項目百度網盤 17:仿阿里系優酷網-企業級Go改造PHP項目踩坑避坑指北 18:理論+實戰 構建完整JVM知識體系 19:JavaScript版數據結構與算法 輕松解決前端算法面試 20:React+TypeScript高仿AntDesign開發企業級UI組件庫 21:移動端Python爬蟲實戰-2020版 22:Node.js從零開發Web Server博客項目 前端晉升全棧工程師必備 23:Java可視化UML工作流系統(Activiti7+SpringBoot) 24:快速搞定前端技術一面 匹配大廠面試要求(升級版) 25:微信小程序云開發-從0打造云音樂全棧小程序百度網盤 26:Spring Cloud + Vue 前后端分離 開發企業級在線視頻課程系統 27:(2020新版)基于Spring Cloud微服務架構 廣告系統設計與實現下載地址:百度網盤 28:全面系統Python3.8入門+進階 (程序員必備第二語言) 29:2020全新升級版-Google資深工程師深度講解Go語言 30:微專業—數據可視化掌握高效數據可視化技法 31:2020最新版React Native從入門到實戰打造高質量上線App 32:Vue 實戰商業級讀書Web APP 全面提升技能 33:SparkSQL極速入門 整合Kudu實現廣告業務數據分析 34:網易“白帽子黑客”訓練營 35:2020全面系統學測試 從小白入門到實戰就業 36:Vue.js源碼全方位深入解析 (含Vue3.0源碼分析) 37:混合開發入門 Vue結合Android/iOS開發仿京東項目App 38:一站式學習Redis 從入門到高可用分布式實踐 39:Vue全家桶實戰 從零獨立開發企業級電商系統(免費升級Vue3.0)點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> 40:前端框架及項目面試 聚焦Vue/React/Webpack 41:主流技術棧的Restful API接口測試實戰 42:2020升級版系統學習Docker 踐行DevOps理念 43:精講Elastic-job + Quartz實現企業級定時任務 44:零基礎入門 Python Web 自動化測試 45:React16組件化+測試+全流程 實戰在線賬本項目 46:WebRTC實時互動直播技術入門與實戰 5G時代必備技能 47:零基礎入門 全角度解讀企業主流數據庫MySQL8.0 48:強力Django+殺手級xadmin開發在線教育網站 采用 Python3.7全新開發 49:Node.js從零開發Web Server博客項目 前端晉升全棧工程師必備 50:基于GitHub App 深度講解Kotlin高級特性與框架設計 51:Gradle3.0自動化項目構建技術精講+實戰 52:暢銷3年的Python分布式爬蟲課程 Scrapy打造搜索引擎 53:專為程序員設計的統計課 徹底學會統計分析 54:Python接口自動化測試框架實戰 從設計到開發 55:全方位深入解析最新版SpringBoot源碼 56:玩轉算法系列–圖論精講 面試升職必備(Java版) 57:Python3入門機器學習 經典算法與應用 輕松入行人工智能 58:Python3入門人工智能 掌握機器學習+深度學習 提升實戰能力 59:Spring Cloud + Vue 前后端分離 開發企業級在線視頻課程系統 60:Spark2.x+協同過濾算法,開發企業級個性化推薦系統 61:Go讀書社區web開發與高性能架構優化 62:Spark2.x+協同過濾算法,開發企業級個性化推薦系統 ElasticSearch7+Spark 構建高匹配度搜索服務+千人千面推薦系統 劍指Java自研框架,決勝Spring源碼 Spark + ElasticSearch 構建電商用戶標簽系統實現精準營銷 劍指Java項目面試 助你順利Offer 告別996,開啟Java高效編程之門 線程八大核心+Java并發底層原理精講 Spring Cloud微服務實戰 打造企業級優惠卷系統 Spring Cloud微服務安全實戰 一站式學習Java網絡編程 全面理解BIO/NIO/AIO 聚焦Java性能優化 打造億級流量秒殺系統(附贈秒殺項目) 從0開始 獨立完成企業級Java電商網站服務端開發(服務端) Spring Cloud Alibaba微服務從入門到進階 阿里新零售數據庫設計與實戰 (升級版)點擊下載地址:<a href="http://www.51xuebc.com/" target="_blank">百度網盤</a> 編程必備基礎-音視頻小白系統入門課 大學計算機必修課新講–編譯原理+操作系統+圖形學 算法與數據結構-綜合提升 C++版 2020 重學C++ 重構你的C++知識體系 FFmpeg音視頻核心技術精講與實戰 Python Flask高級編程之從0到1開發《魚書》精品項目 Django入門到進階-適合Python小白的系統課程 Python爬蟲工程師從入門到進階 Node.js+Koa2框架生態實戰 - 從零模擬新浪微博 React全家桶+AntD共享單車后臺管理系統開發 React勁爆新特性Hooks 重構旅游電商網站火車票PWA Node.js+Koa2+MySQL打造前后端分離精品項目《舊島》</p> <p><a href="http://www.51xuebc.com/" target="_blank">點擊查看等多海量it課程</a></p> </div>jiafeimao123Fri, 09 Apr 2021 06:23:21 GMTpython 進階訓練營云盤分享https://www.www.wsns.net.cn/topics/175https://www.www.wsns.net.cn/topics/175<div class="markdown-text"><h2><a href="download" target="_blank">python進階訓練營</a></h2> <p>2021最新完結python進階精品訓練營課程! 模塊一:從其他語言平滑遷移到 Python 開發</p> <ol> <li>從其他語言的開發環境平滑遷移到 Python 開發環境</li> <li>掌握常用的代碼調試技巧和調試工具</li> <li>掌握 Linux 等常用操作系統上的環境設置</li> <li>學會配置 venv 虛擬開發環境 模塊二:掌握 Web 開發的基石- HTTP 協議</li> <li>掌握在 Python 中如何操作 HTTP 協議</li> <li>了解 HTTP 協議的工作原理</li> <li>學會用 Python 進行文件相關的操作 模塊三:掌握如何使用 Python 操作數據庫</li> <li>關系型數據的基本概念和操作</li> <li>熟練使用 Python 操作 MySQL7</li> <li>SQL 常用語法</li> <li>SQL 優化技巧 模塊四:掌握 Django Web 框架</li> <li>掌握 Django 的 urls 調度器</li> <li>深入理解 MTV 設計模式</li> <li>掌握 Django 關鍵組件</li> <li>掌握 ORM API 的使用 模塊五:中間件</li> <li>掌握常用的消息隊列、分布式緩存機制和實現</li> <li>掌握分布式緩存 Redis 及如何與 Django 集成</li> <li>掌握消息隊列 RabbitMQ 的原理和特性</li> <li>深入理解 RPC 服務 模塊六:面向對象編程進階</li> <li>掌握 Python 面向對象編程的特性</li> <li>掌握常見的幾種設計模式 模塊七:巧用裝飾器</li> <li>掌握 Python 函數的高級特性</li> <li>學會用裝飾器寫出更加優雅高效的代碼 模塊八:動手實現一個文字版微博 Web 應用</li> <li>掌握 RESTful API 的設計方法</li> <li>應用 Python 面向對象編程和函數高級特性進行項目實戰 模塊九:Django 源碼分析</li> <li>深入掌握框架的原理</li> <li>舉一反三,能夠快速學會其它的 Web 框架 模塊十:面試??贾R點</li> <li>掌握多進程多線程/ T1</li> <li>掌握鎖機制</li> <li>掌握線程池</li> <li>掌握 GIL 鎖導致的性能限制</li> <li>掌握協程的使用 (選學)模塊十一:Scrapy 爬蟲進階及反爬蟲機制</li> <li>掌握 Scrapy 框架的原理及項目結構</li> <li>了解常見的反爬蟲手段及其原理 (選學)模塊十二:Python 數據分析+ T4</li> <li>熟練使用 Pandas 進行數據分析</li> <li>掌握分詞工具 jieba 的使用技巧</li> <li>能夠用 SnowNLP 分析情感傾向</li> </ol> </div>jiafeimao123Wed, 07 Apr 2021 12:56:28 GMTJava 異常與調優一站式解決方案https://www.www.wsns.net.cn/topics/174https://www.www.wsns.net.cn/topics/174<div class="markdown-text"><h2>下載地址:<a href="http://www.97yrbl.com/t-551.html" target="_blank">百度網盤</a></h2> <p>項目異常不斷,找不到問題所在?百度、Google搜個遍,也找不到答案?本課程針對Java開發中常見的各種異常,從日志、堆棧再深入到JVM,帶你發現問題、定位問題、解決問題,最后在實戰中搭建開箱即用的SpringBoot腳手架,強化鞏固所學,助力你提升開發技能!</p> <p>技術要求 基本的Java語法 理解Spring的思想和理念 環境參數 JDK 1.8、 SpringBoot 2.1.4.RELEASE</p> </div>yuanrenbuluoTue, 06 Apr 2021 16:13:08 GMT2021必修 CSS 架構系統精講https://www.www.wsns.net.cn/topics/172https://www.www.wsns.net.cn/topics/172<div class="markdown-text"><h2>點擊下載:<a href="http://www.97yrbl.com/t-549.html" target="_blank">百度網盤</a></h2> <p>CSS代碼越來越臃腫難維護?前期編程不重視,后期重構累禿頭? 本課程基于CSS開發中的痛點問題,通過高仿蘑菇街項目,帶你從0到1構架自己的CSS代碼,形成一套成熟的易維護、易擴展、易復用的架構思想。不管是架構還是技巧層面,都能玩轉CSS!</p> <p>技術適合人群要求 工作2-5年的前端工程師 技術儲備要求 掌握前端基礎(HTML+CSS+JS) 對Vue+ Scss有基本了解 技術參數 Vue3.0、CSS3、Sass、Webpack4</p> </div>yuanrenbuluoTue, 06 Apr 2021 10:24:43 GMT大前端超清完整需要自行下載https://www.www.wsns.net.cn/topics/171https://www.www.wsns.net.cn/topics/171<div class="markdown-text"><p><img src="/oss/images/topics/2020/7/17899b3bfc038027c4b21b847f3e1017.png" alt=""></p> <h1>大前端超清完整<a href="http://www.51xuebc.com/thread-135-1-1.html" target="_blank">【點擊自行下載】</a></h1> <p>比前端全棧更上一層 專為實際開發經驗1年以上的前端工程師設計 高效全能架構前端</p> <p>章節目錄: 第一階段 第二階段 第三階段 第四階段 第五階段 第一階段:開啟大前端之門(1-4周) 第1周 認識大前端,開啟無限可能</p> <p>萬丈高樓平地起。開課第一周,我們將以輕松幽默的方式,從實際工作中的開發痛點出發,以項目全生命周期為主線,對全棧有全局的認識。從整體項目分析開始,培養您的項目架構思維。 課程安排:</p> <ol> <li> <pre><code>了解大前端知識體系,讓您有全局的認知 </code></pre> </li> <li> <pre><code>理解大前端的定義,讓您不再迷茫 </code></pre> </li> <li> <pre><code>項目規劃及DevOps流程 </code></pre> </li> <li> <pre><code>分析實際工作中遇到的痛點以及解決辦法 </code></pre> </li> <li> <pre><code>掌握需求分析的要點及工具(墨刀/Axure) </code></pre> </li> <li> <pre><code>從原型設計、接口設計到技術棧的宏觀項目架構思維 </code></pre> </li> </ol> <p>第2周 企業標準的開發環境搭建</p> <p>工欲善其事,必先利其器。學習最火的Docker容器技術,快速搭建測試環境。深入講解前端必會的Mock接口與工具,并專門設計了調試技巧&amp;真機調試講解,與實際工作開發完美契合。 課程安排:</p> <ol> <li> <pre><code>虛擬機搭建與使用 </code></pre> </li> <li> <pre><code>Linux開發環境及常見命令使用 </code></pre> </li> <li> <pre><code>容器技術Docker以及安裝及使用 </code></pre> </li> <li> <pre><code>Node及npm命令的使用 </code></pre> </li> <li> <pre><code>搭建DOClever接口測試平臺 </code></pre> </li> <li> <pre><code>前后端分離開發--RESTful接口及Mock數據 </code></pre> </li> <li> <pre><code>常見IDE使用及VSCode的調試配置及默認設置 </code></pre> </li> <li> <pre><code>三類真機調試技巧 </code></pre> </li> </ol> <p>第3周 必會的前端工程化工具</p> <p>效率是檢驗工程師的重要指標之一,如何提高開發效率,從前端工程化工具著手。本周學習實際工作中兩大利器Webpack與Gulp,并使用Yeoman搭建自己的腳手架工具,讓自己和團隊的開發效率翻倍。 課程安排:</p> <ol> <li> <pre><code>了解工程化工具的使用場景及具體應用 </code></pre> </li> <li> <pre><code>理解Webpack的核心概念,配置Webpack </code></pre> </li> <li> <pre><code>掌握Webpack中的Plugin及Loader的使用 </code></pre> </li> <li> <pre><code>了解Gulp的核心概念,學習配置Gulp基礎任務 </code></pre> </li> <li> <pre><code>配置Yeoman腳手架工程項目 </code></pre> </li> <li> <pre><code>創建自己的腳手架工具 </code></pre> </li> </ol> <p>第4周 深入理解Vue 框架知識</p> <p>跟上企業需求的步伐,本周從MVVM框架基礎講起,讓您擁有組件化思想,掌握目前流行的Vue框架進階應用。重點不僅在于應用,也在于原理,做到知其然,知其所以然。 課程安排:</p> <ol> <li> <pre><code>了解MVVM框架理念 </code></pre> </li> <li> <pre><code>理解組件化思想 </code></pre> </li> <li> <pre><code>Vue基礎、路由及狀態管理 </code></pre> </li> <li> <pre><code>Vue cli工具的使用,創建工程化項目 </code></pre> </li> <li> <pre><code>Vue CLI命令vue create及項目配置 </code></pre> </li> <li> <pre><code>Vue CLI命令擴展使用vue ui </code></pre> </li> <li> <pre><code>Vue、Vue-router、Vuex綜合應用 </code></pre> </li> </ol> <p>第二階段:獲取團隊高效協作密碼(5-7周) 第5周 前端框架分類及選型</p> <p>是否還在為選擇使用什么框架而苦惱?是否還在為學習哪個前端框架而糾結?本周將給您滿意的答案,有UI和JS框架對比與選型,有Node.js進階使用、Web框架如何開發RESTful接口等。 課程安排:</p> <ol> <li> <pre><code>常見MVVM與UI框架對比與選型 </code></pre> </li> <li> <pre><code>Koa框架后臺項目的配置及ES6語法支持 </code></pre> </li> <li> <pre><code>Koa工作原理及常見Koa中間件使用 </code></pre> </li> <li> <pre><code>登錄模塊的需求分析及流程設計 </code></pre> </li> <li> <pre><code>登錄模塊的開發,LayUI框架集成 </code></pre> </li> <li> <pre><code>郵件服務和圖片驗證碼服務的開發 </code></pre> </li> <li> <pre><code>表單驗證Vuelidate/VeeValidate </code></pre> </li> <li> <pre><code>配置郵件服務NodeMailer </code></pre> </li> <li> <pre><code>郵件服務接口與找回密碼對接 </code></pre> </li> <li> <pre><code>如何調試Node應用及webpack配置 </code></pre> </li> </ol> <p>第6周 團隊協作-文檔與版本管理</p> <p>項目開發過程中,少不了團隊協作,那團隊協作有哪些可以提升效率?團隊協作第一彈:從文檔管理、版本控制開始,我們了解Git flow和文檔的管理辦法,搭建團隊的文檔管理工具,提升工作效率。 課程安排:</p> <ol> <li> <pre><code>Markdown語法及進階圖表使用 </code></pre> </li> <li> <pre><code>ShowDoc進行云筆記及文檔管理 </code></pre> </li> <li> <pre><code>搭建自己團隊的接口管理平臺 </code></pre> </li> <li> <pre><code>學會使用hexo+github搭建自己的博客 </code></pre> </li> <li> <pre><code>掌握Git基礎命令 </code></pre> </li> <li> <pre><code>從零配置github到SSH秘鑰克隆倉庫 </code></pre> </li> <li> <pre><code>Git Flow及管理版本控制 </code></pre> </li> <li> <pre><code>使用Docker快速搭建gitlab平臺 </code></pre> </li> <li> <pre><code>gitlab平臺管理,用戶權限控制 </code></pre> </li> </ol> <p>第7周 團隊協作-缺陷控制與自動化流程</p> <p>項目質量決定了項目的命運,如何做好缺陷控制,是每個團隊非常頭疼的問題。本周學習團隊協作第二彈:缺陷控制及前端自動化流程,使用容器技術配置自動化/持續集成環境,進一步提升團隊效率。 課程安排:</p> <ol> <li> <pre><code>掌握容器技術Docker進階使用 </code></pre> </li> <li> <pre><code>掌握缺陷控制工具及使用 </code></pre> </li> <li> <pre><code>了解質量管理工作流 </code></pre> </li> <li> <pre><code>理解自動化/持續集成流程,升華DevOps理解 </code></pre> </li> <li> <pre><code>私有化容器平臺Harbor搭建及使用 </code></pre> </li> <li> <pre><code>快速搭建、配置Jenkins服務 </code></pre> </li> <li> <pre><code>掌握Jenkins中的權限控制,并與gitlab進行集成 </code></pre> </li> <li> <pre><code>學習Jenkins的權限控制與插件管理系統 </code></pre> </li> <li> <pre><code>配合Jenkins效率構建,完成發布、構建等 </code></pre> </li> </ol> <p>第三階段:打通全棧開發技能(8-13周) 第8周 NoSQL數據庫的設計與集成(MongoDB/Redis)</p> <p>本周帶您解開數據之謎,學習NoSQL數據庫與數據庫設計原則,讓您帶著設計思維去設計項目數據庫。掌握Redis安裝、常用CLI命令,搞定Redis服務搭建與Nodejs集成 課程安排:</p> <ol> <li> <pre><code>了解NoSQL數據庫分類及選型 </code></pre> </li> <li> <pre><code>掌握數據庫設計原則 </code></pre> </li> <li> <pre><code>掌握從功能到數據庫的基本設計 </code></pre> </li> <li> <pre><code>常見MongoDB及Redis與nodejs集成 </code></pre> </li> <li> <pre><code>使用Docker快速搭建MongoDB及Redis開發測試環境 </code></pre> </li> </ol> <p>第9周 JWT登錄鑒權—通用登錄模塊后端開發</p> <p>本周解讀鑒權、加密/算法、HTTPS等核心概念,實踐JWT方式進行登錄鑒權接口設計。從前到后,涵蓋輸入校驗、Axios請求封裝、統一錯誤處理、jwt功能集成及數據安全性策略的分析等知識。 課程安排:</p> <ol> <li> <pre><code> 前端常見鑒權方式及優缺點 </code></pre> </li> <li> <pre><code> 算法/加密、HTTPS等概念大解密 </code></pre> </li> <li> <pre><code> JWT工作原理及Koa-jwt功能集成 </code></pre> </li> <li> <pre><code> 前端接口Axios封裝 </code></pre> </li> <li> <pre><code> 前端統一錯誤處理、后端統一錯誤響應 </code></pre> </li> <li> <pre><code> 后端接口響應,數據校驗 </code></pre> </li> <li> <pre><code> 自定義vue組件,優化前端登錄注冊交互 </code></pre> </li> <li> <pre><code> 輸入校驗、遠程校驗結合提升用戶體檢 </code></pre> </li> <li> <pre><code> 登錄注冊Mock數據,vscode調試進階 </code></pre> </li> </ol> <p>第10周 全棧開發-首頁模塊</p> <p>從數據庫、接口設計到組件拆分,再到首頁核心功能實現,提高對前置流程理解與工具使用的熟練度。本周通過原型圖到實現首頁交互(復雜篩選)及接口,綜合運用前置知識,學習項目開發的實戰內容。 課程安排:</p> <ol> <li> <pre><code>Npm依賴升級方案,@vue/cli升級V4版本 </code></pre> </li> <li> <pre><code>PC端項目全局需求分析、原型設計、項目重難點介紹 </code></pre> </li> <li> <pre><code>掌握首頁、發帖、用戶中心數據庫設計、接口設計、文檔更新 </code></pre> </li> <li> <pre><code>首頁多級列表、篩選、排序功能開發 </code></pre> </li> <li> <pre><code>路由監聽/路由守衛/子路由ActiveClass靈活應用開發交互效果 </code></pre> </li> <li> <pre><code>Axios請求封裝/攔截器/取消用戶重復請求 </code></pre> </li> <li> <pre><code>側欄:統計、簽到、周熱議 功能開發 </code></pre> </li> <li> <pre><code>首頁Mock數據調試長列表加載、接口開發、前后端接口聯調 </code></pre> </li> <li> <pre><code>版本控制建立Git倉庫,熟悉Git相關操作 </code></pre> </li> <li> <pre><code>缺陷控制實戰:代碼Prettier格式化、ESLint自動修復實踐、配置Standart規則 </code></pre> </li> </ol> <p>第11周 全棧開發—用戶中心和發貼/回帖模塊</p> <p>繼續開發個人中心和發帖兩個核心業務,完成PC端社區業務閉環,豐富的Vue-router、Vuex進階應用和自定義組件,完成周榜、簽到榜、熱評榜的功能,實現簽到積分系統,完善個人中心設置,并學習MongoDB進階統計語句的用法。 課程安排:</p> <ol> <li> <pre><code>優化登錄路由,本地緩存登錄狀態(介紹localStorage&amp;SessionStorage區別) </code></pre> </li> <li> <pre><code>自定義富文本編輯器開發(插入鏈接|圖片、引用|代碼樣式、預覽) </code></pre> </li> <li> <pre><code>帖子詳情、采納、點贊功能開發 </code></pre> </li> <li> <pre><code>個人中心收藏列表、發貼列表功能開發 </code></pre> </li> <li> <pre><code>簽到系統,積分體系的設計 </code></pre> </li> <li> <pre><code>發貼權限效驗 </code></pre> </li> <li> <pre><code>Vue自定義directive/filters妙用 </code></pre> </li> <li> <pre><code>改造入口文件routes,后端路由按模塊動態引入 </code></pre> </li> <li> <pre><code>調試賬號修改郵件通知功能 </code></pre> </li> <li> <pre><code>Nodejs靜態資源處理、文件上傳后臺、路徑相關進階操作 </code></pre> </li> <li> <pre><code>自制Iconfont圖標庫 </code></pre> </li> <li> <pre><code>Sass進階學習@for/@Mixin/@Map的用法 </code></pre> </li> </ol> <p>第12周 消息中間件開發(WebSocket通信)</p> <p>Websocket是長連接的最優解決方案,本周通過對比Socket.io的更優的性能方案ws,學習WebSocket分組消息、斷線重連、心跳檢測、離線消息緩存、歷史消息,開發通用消息中間件,了解企業級IM即時通信的核心功能開發。 課程安排:</p> <ol> <li> <pre><code>WebSocket基礎,WebSocket與Socket.io進行對比 </code></pre> </li> <li> <pre><code>Socket.io開發簡單的消息應用 </code></pre> </li> <li> <pre><code>進階認識WebSocket事件、屬性 </code></pre> </li> <li> <pre><code>使用ws開發多人聊天 室應用(統計在線人數、加入&amp;離開廣播通知) </code></pre> </li> <li> <pre><code>WebSocket消息應用進階(鑒權、心跳檢測、斷線重連) </code></pre> </li> <li> <pre><code>離線消息緩存之Redis緩存解決方案(多房間、多用戶、多條信息緩存) </code></pre> </li> <li> <pre><code>封裝WebSocket客戶端、服務端通用模塊 </code></pre> </li> <li> <pre><code>PC端項目個人中心我的消息功能開發(實時、歷史消息) </code></pre> </li> </ol> <p>第13周 性能優化-服務端渲染</p> <p>隨著SPA(單頁面)應用復雜性變高,頁面SEO也變得越來越重要,需考慮頁面性能優化。服務器端渲染應運而生,是對Nodejs的擴展,也是對前端工程師的又一挑戰。本周將學習配置服務器端渲染思想,以及學習服務端渲染的Vue解決方案Nuxt.js使用,并對前置項目首頁進行改造。 課程安排:</p> <ol> <li> <pre><code>了解SEO優化方法 </code></pre> </li> <li> <pre><code>前端性能優化思想 </code></pre> </li> <li> <pre><code>前端性能優化之服務端渲染(SSR) </code></pre> </li> <li> <pre><code>SSR基礎及工作原理 </code></pre> </li> <li> <pre><code>配置SSR及Webpack進階:服務端渲染開發熱重載 </code></pre> </li> <li> <pre><code>SSR中的路由與代碼分割方案 </code></pre> </li> <li> <pre><code>Nuxt.js框架介紹(工程目錄、Universal Mode、自動生成路由) </code></pre> </li> <li> <pre><code>Nuxt.js Auth登錄鑒權模塊介紹與對接 </code></pre> </li> <li> <pre><code>Nuxt.js集成:改造前端項目首頁功能模塊 </code></pre> </li> </ol> <p>第四階段:前后端分離的后臺管理系統(14-17周) 第14周 后臺管理系統-發帖管理開發</p> <p>本周開始進入后臺管理系統開發,第一步:從需求分析、界面設計、接口設計、數據庫設計,到發帖管理功能模塊開發,及發帖管理接口對接,讓項目開始具備完善的管理系統。 課程安排:</p> <ol> <li> <pre><code> 技術框架選型及UI框架選型 </code></pre> </li> <li> <pre><code> 后端需求分析,接口設計,數據庫設計 </code></pre> </li> <li> <pre><code> iView-admin框架集成 </code></pre> </li> <li> <pre><code> 解析項目架構,添加路由和菜單 </code></pre> </li> <li> <pre><code> 定制開發登錄入口,加入JWT鑒權機制 </code></pre> </li> <li> <pre><code> Cookie及Session的使用方式 </code></pre> </li> <li> <pre><code> 實戰多語言場景:英文&amp;簡體中文 </code></pre> </li> </ol> <p>第15周 中后臺權限系統 - 前端權限設計方案</p> <p>本周將會進入到中后臺系統開發中的最重要的環節:權限系統。介紹前端中的權限控制方案(組件級、按鈕級、路由級三種解決方案),開發用戶管理頁面,定制動態搜索組件,深入學習iview基礎組件:Table、Form、Modal等。 課程安排:</p> <ol> <li> <pre><code> 了解權限設計基礎(權限構成) </code></pre> </li> <li> <pre><code> 學習什么是菜單權限、數據權限? </code></pre> </li> <li> <pre><code> 學習前臺權限控制的三種場景應用 </code></pre> </li> <li> <pre><code> 自定義指令 hasRole實現前端組件級、按鈕組權限控制 </code></pre> </li> <li> <pre><code> 實戰前端基于角色的權限控制方案,了解動態路由添加方法和權限控制方案 </code></pre> </li> <li> <pre><code> 實戰用戶管理頁面開發,自定義動態選項的搜索組件 </code></pre> </li> <li> <pre><code> 深入學習iview基礎組件(Table,Model),加強對ui框架的了解。 </code></pre> </li> <li> <pre><code> 添加用戶模態框,批量設置用戶、批量刪除用戶功能開發 </code></pre> </li> </ol> <p>第16周 中后臺權限系統 - 基于角色&amp;菜單權限設計</p> <p>本周將繼續深入權限系統,開發包括菜單管理、角色管理以及后臺權限管理API,開發nodejs中間件,實現基于角色的接口資源訪問控制系統。加深前置知識的綜合應用,從前到后,打通權限設計的全方位思維。 課程安排:</p> <ol> <li> <pre><code>菜單權限設計思路:關系型數據庫、非關系型數據庫中的不同點 </code></pre> </li> <li> <pre><code>從0到1,設計菜單基礎信息頁面、角色權限頁面原型&amp;布局 </code></pre> </li> <li> <pre><code> 實戰角色管理、菜單管理、權限分配界面頁面樣式開發(綜合應用iview基礎組件) </code></pre> </li> <li> <pre><code>Nodejs后臺基于角色的菜單權限 + 數據接口權限的完整解決方案(RBAC方案) </code></pre> </li> <li> <pre><code>koa鑒權中間件開發,對資源權限進行訪問控制 </code></pre> </li> </ol> <p>第17周 首頁可視化圖表與日志服務</p> <p>本周將完成后端管理平臺的首頁管理,對首頁統計功能進行定制開發,并增加日志服務,對后臺接口的調用增加日志管理,系統功能完善與監管。以及前后端聯調及細節優化,定制Jenkins任務及配置前后端自動化任務。 課程安排:</p> <ol> <li> <pre><code>Echarts基礎&amp;地圖類型圖表兩種解決方案 </code></pre> </li> <li> <pre><code>首頁統計:周數據統計、新增用戶統計、發帖、進日統計 </code></pre> </li> <li> <pre><code>監控日志兩種方法:調試日志koa-logger和文件日志koa-log4j </code></pre> </li> <li> <pre><code>掌握前后端聯調技能 </code></pre> </li> <li> <pre><code>自動化流程回顧+Jenkins節點管理 </code></pre> </li> <li> <pre><code>接口項目配置自動化任務(敏感信息、微信通知) </code></pre> </li> <li> <pre><code>自動化部署前后臺項目 </code></pre> </li> <li> <pre><code>配置前后端項目的自動化 </code></pre> </li> </ol> <p>第五階段:移動WebApp與小程序開發(18-24周) 第18周 WebApp頁面設計與開發</p> <p>隨著終端設備的發展,在移動端瀏覽Web已成主流。本周繼續進行WebApp功能模塊開發:登錄頁面、首頁及個人中心開發,學習了解消息機制,移動端消息開發。 課程安排:</p> <ol> <li> <pre><code>WebApp原型設計及工具使用、WebApp開發的常見問題 </code></pre> </li> <li> <pre><code>移動端框架概覽及Mint-UI介紹 &amp; 自定義主題 </code></pre> </li> <li> <pre><code>自定義SVG圖標組件(巧用svg-sprite-loader) </code></pre> </li> <li> <pre><code>Vuex狀態管理state分層及Modules進階應用 </code></pre> </li> <li> <pre><code>全局樣式方案Normalize與Reset </code></pre> </li> <li> <pre><code>開發登錄、注冊、密碼找回頁面 </code></pre> </li> <li> <pre><code>首頁列表及篩選、個人中心開發 </code></pre> </li> <li> <pre><code>評論列表無限加載模塊 </code></pre> </li> <li> <pre><code>上拉加載、下拉刷新的開發技巧 </code></pre> </li> <li> <pre><code>自定義Header組件 </code></pre> </li> </ol> <p>第19周 WebApp前后端聯調</p> <p>WebApp頁面開發只是第一步,如何和后端對接,掌握從后臺管理到前端展現的整體解決方案,提升技能和解決實際問題的能力更為重要。 課程安排:</p> <ol> <li> <pre><code>詳情頁面交互設計、表情出層(transition動畫進階) </code></pre> </li> <li> <pre><code>滾動穿透解決方案(iscroll &amp; better-scroll介紹) </code></pre> </li> <li> <pre><code>移動端適配解決方案(px-to-viewport &amp; px-to-rem) </code></pre> </li> <li> <pre><code>WebApp項目容器化實戰,配置Dockerfile及打包鏡像 </code></pre> </li> <li> <pre><code>Jenkins自動發布配置,多節點配置及管理 </code></pre> </li> <li> <pre><code>消息頁面、消息、個人中心、熱門功能開發 </code></pre> </li> <li> <pre><code>熱門功能開發:多條件統計列表開發,前后端數據對接 </code></pre> </li> </ol> <p>第20周 小程序基礎與進階</p> <p>便捷的快應用時代已到,本周介紹小程序的開發適用場景及常見的快應用開發框架:mpvue/wepy/uniapp區別與應用場景。實操小程序的注冊流程,掌握開發中的注意事項。學習小程序原生框架基本用法,及快應用開發框架的使用,并且能獨立調試開發小程序。 課程安排:</p> <ol> <li> <pre><code>了解小程序注冊流程 </code></pre> </li> <li> <pre><code>了解小程序注冊方式及注冊主體 </code></pre> </li> <li> <pre><code>了解跨端框架適用場景及開發工作流 </code></pre> </li> <li> <pre><code>掌握小程序本地開發環境配置 </code></pre> </li> <li> <pre><code>掌握小程序本地化調試辦法 </code></pre> </li> <li> <pre><code>小程序第三方npmjs庫集成 </code></pre> </li> <li> <pre><code>掌握快應用場景:mpvue/wepy/uni-app基礎 </code></pre> </li> </ol> <p>第21周 小程序首頁/菜單定制/登錄開發</p> <p>小程序效率開發之mpvue,小程序開發實戰第一部分。學習首頁的列表開發,菜單定制的開發。熟練查閱微信接口文檔,學習配置小程序開發者相關功能,了解微信登錄機制 、開發配置接口及擴展用戶數據庫&amp;接口。 課程安排:</p> <ol> <li> <pre><code>熟悉微信小程序開發文檔,獲取用戶登錄狀態,開發API微信配置接口 </code></pre> </li> <li> <pre><code>如何集成小程序第三方UI組件庫:vant-weapp </code></pre> </li> <li> <pre><code>掌握小程序開發者工具配置,如何配置app </code></pre> </li> <li> <pre><code>框架原理,熟悉了解小程序的生命周期 </code></pre> </li> <li> <pre><code>學習mpvue基礎的語法 &amp; 不支持的Vue語法/函數特性 </code></pre> </li> <li> <pre><code>多頁面下的開發工作流及目錄結構 </code></pre> </li> <li> <pre><code>封裝通用libs庫(HTTP請求、緩存) </code></pre> </li> <li> <pre><code>mpvue長列表優化方案,精簡data數據 </code></pre> </li> <li> <pre><code>上拉加載、下拉刷新如何使用及使用場景 </code></pre> </li> </ol> <p>第22周 小程序詳情面/個人中心開發</p> <p>小程序開發實戰第二部分,學習個人中心模塊、詳情頁面、編輯發貼功能開發,與后臺接口進行對接,完成頁面的功能調試。 課程安排:</p> <ol> <li> <pre><code>小程序頁面設計思想 </code></pre> </li> <li> <pre><code>了解小程序工程化項目 </code></pre> </li> <li> <pre><code>了解小程序的生命周期 &amp; mpvue頁面生命周期 </code></pre> </li> <li> <pre><code>小程序自定義組件(原生組件與mpvue集成) </code></pre> </li> <li> <pre><code>熟悉小程序開發配置,學習配置微信安全域名、開發者 </code></pre> </li> <li> <pre><code>業務功能模塊:完成詳情頁面、個人中心功能開發 </code></pre> </li> <li> <pre><code>掌握小程序常用組件,開發富文本內容 </code></pre> </li> </ol> <p>第23周 小程序編輯與發貼開發</p> <p>小程序開發實戰第三部分,實戰mpvue進階,熟練使用vuex進行狀態管理,效率小程序開發。學習編輯、發貼功能開發,與后臺接口進行對接,完成頁面的整體功能調試。 課程安排:</p> <ol> <li> <pre><code>掌握小程序訂閱消息機制 &amp; 消息配置 &amp; 消息發送 </code></pre> </li> <li> <pre><code>訂閱消息功能的接口設計與開發 </code></pre> </li> <li> <pre><code>編輯與發帖模塊開發 </code></pre> </li> <li> <pre><code>掌握小程序發布流程及版本管理 </code></pre> </li> <li> <pre><code>小程序上線準備及HTTPS證書申請方案 </code></pre> </li> <li> <pre><code>前后端接口對接及后臺項目Nginx配置 HTTPS </code></pre> </li> <li> <pre><code>快應用框架需要注意的開發坑點 &amp; 升級指南 </code></pre> </li> </ol> <p>第24周 項目部署與運維</p> <p>介紹云服務器、域名及HTTPS服務,項目運維及Linux相關自啟腳本介紹。項目更新及日志處理,如何發送報警通知及應急策略的制定。了解移動端框架、混合與跨端應用框架,桌面應用Electron等,做好未來發展指引 。 課程安排:</p> <ol> <li> <pre><code>如何進行服務器監控、服務器日志及報警 </code></pre> </li> <li> <pre><code>Jenkins配置IM通知(釘釘構建通知、企業微信通知、郵件通知) </code></pre> </li> <li> <pre><code>理解域名服務及配置Nginx &amp; HTTPS(通過Acme申請SSL證書) </code></pre> </li> <li> <pre><code>了解購買云服務器及熟悉面板管理 </code></pre> </li> <li> <pre><code>能編寫基本的運維腳本 </code></pre> </li> <li> <pre><code>項目運行維護/更新終止/資源回收 </code></pre> </li> <li> <pre><code>了解項目總結及如何進行 </code></pre> <h1><a href="http://www.51xuebc.com/thread-135-1-1.html" target="_blank">網盤鏈接下載</a></h1> </li> </ol> </div>51xuebcTue, 14 Jul 2020 18:17:15 GMTJava 架構師成長直通車https://www.www.wsns.net.cn/topics/170https://www.www.wsns.net.cn/topics/170<div class="markdown-text"><h1>Java架構師成長直通車完整無密 <a href="http://www.51xuebc.com/thread-134-1-1.html" target="_blank">【點擊下載】</a></h1> <p><img src="/oss/images/topics/2020/7/413f088a23a9d3ffc4ab98fe219b1ab7.png" alt=""></p> <h3>Java架構師成長直通車</h3> <h3>國內外一線大廠技術大咖與某課網組成專家團隊12個月磨一劍</h3> <h3>千萬級電商項目從0到1到100全過程</h3> <h3>涵蓋Java程序員不同成長階段的問題及優選解決方案</h3> <h1><a href="http://www.51xuebc.com/thread-134-1-1.html" target="_blank">【百度網盤鏈接下載】</a></h1> </div>jiafeimao123Sat, 11 Jul 2020 05:35:34 GMT大家好 新手一枚 請多關照哈https://www.www.wsns.net.cn/topics/169https://www.www.wsns.net.cn/topics/169<div class="markdown-text"><p>大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…大家好 新手一枚 請多關照哈…</p> </div>fp2060Sun, 21 Jun 2020 06:11:25 GMTEMQ - 杭州映云科技招聘 Web 前端開發工程師(昆明)https://www.www.wsns.net.cn/topics/168https://www.www.wsns.net.cn/topics/168<div class="markdown-text"><h2>關于 EMQ</h2> <p><a href="https://www.emqx.io/cn/" target="_blank">EMQ - 杭州映云科技</a> 是一家開源軟件公司,專注于 5G 和物聯網領域的消息與流處理軟件,面向全球運營。</p> <p>EMQ 總部位于杭州,在北京、上海、硅谷、法蘭克福設有分支機構,核心產品包括面向云和邊緣計算的 IoT 消息中間件以及輕量級流式處理中間件,累計已服務全球 5000+ 企業用戶,并與數十家世界 500 強企業達成戰略合作,典型用戶包括 HPE、VMware、Verifone、Ericsson、華為、中國電信、中國移動、國家電網、上汽大眾等。</p> <p>EMQ 發起與運營的開源 <a href="https://www.emqx.io/cn/products/broker" target="_blank">物聯網 MQTT 服務器</a>,Github Star 數量在同類型項目中排名第一,是國內在開源領域具有全球影響力的項目之一。</p> <p>EMQ X 開源項目: <a href="https://github.com/emqx/emqx%E3%80%82" target="_blank">https://github.com/emqx/emqx。</a></p> <h2>Web 前端開發工程師 (6k-12k)</h2> <h4>崗位職責</h4> <ol> <li>參與 <a href="https://cloud.emqx.io/cn/" target="_blank">MQTT 5.0 物聯網云服務平臺</a> 的前端開發工作;</li> <li>參與公司相關開源產品的 Dashboard 前端開發工作;</li> <li>參與公司前端基礎技術框架的設計、研發及維護;</li> </ol> <h4>任職要求</h4> <ol> <li> <p>本科及以上學歷,且具有良好的審美能力;</p> </li> <li> <p>熟練掌握 JavaScript、HTML 和 CSS,且有 ES6 使用經驗;</p> </li> <li> <p>熟練掌握 Vue、React、Angular 三個主流框架中的一種;</p> </li> <li> <p>熟悉 Webpack/Gulp 等前端構建工具;</p> </li> <li> <p>有 Python 開發經驗者優先;</p> </li> <li> <p>加分項:熟練使用 Unix/Linux 操作系統,熟悉 TCP/IP 、HTTP 、MQTT 協議。</p> </li> </ol> <hr> <p>簡歷投遞至: <strong><a href="mailto:hr@emqx.io" target="_blank">hr@emqx.io</a></strong> 。</p> </div>emqttxThu, 11 Jun 2020 09:18:11 GMT【新加坡】前端開發工程師 【福利好,年終獎金4-6個月】https://www.www.wsns.net.cn/topics/167https://www.www.wsns.net.cn/topics/167<div class="markdown-text"><p>[新加坡] 前端開發工程師</p> <p>誠聘數位前端開發 (初,中,高級)</p> <p>Bybit是一家全球性的數字貨幣衍生品交易平臺,用戶遍布全球80多個國家,日均交易額超8億美金。創始團隊由專業投資人與傳統金融領域高管組成,核心研發團隊來自摩根士丹利、騰訊、平安、諾亞等。</p> <p>我們誠聘大量的IT人才支持業務拓展,可視頻面試。 目前招聘:前端工程師 | 后端工程師 | C++/Golang工程師</p> <p>福利待遇優厚: 季度和年度獎金,15天年假起,工作時間靈活,培訓津貼,醫藥保險,14 天帶薪病假,員工團建活動等等</p> <p>詳細的工作內容: <a href="https://www.jobstreet.com.sg/en/job/7936330/sources/2" target="_blank">https://www.jobstreet.com.sg/en/job/7936330/sources/2</a></p> <p>工作地點:新加坡,金融區</p> <p>對英文沒有要求,IT團隊多以中文溝通, 整體公司團隊多元化。</p> <p>有意者可以電郵簡歷至 <a href="mailto:recruit@bybit.com" target="_blank">recruit@bybit.com</a></p> </div>RecruitBybitSun, 07 Jun 2020 05:28:50 GMT大學計算機必修課新講--編譯原理+操作系統+圖形學https://www.www.wsns.net.cn/topics/165https://www.www.wsns.net.cn/topics/165<div class="markdown-text"><p><img src="/oss/images/topics/2020/5/7b5ba3e36749fbc0b01b264d9bb1b6d4.png" alt=""></p> <h3>大學計算機必修課新講–編譯原理+操作系統+圖形學 無密 <a href="http://www.97yrbl.com/t-310.html" target="_blank">【點擊下載】</a></h3> <p>編譯原理,操作系統,圖形學被稱為程序員的三大浪漫,不僅因為它們是大學計算機系的必修內容,更因為它們在回答計算機領域三個基本問題:程序如何被編譯成機器指令然后被執行(編譯原理)、多個程序如何共享資源(操作系統)、人和機器如何交互(圖形學)。掌握這些知識不僅是為了應付大學考試,更是為了能讓你在未來的“大型化開發”、“底層開發”中更從容,讓你能更好的應對面試、開發、造輪子等實際問題。</p> <p>適合人群</p> <p>科班出身但相關基礎知識薄弱的同學</p> <p>非科班出身,渴望增強核心競爭力的同學</p> <p>技術儲備要求</p> <p>具備高中數學知識</p> <p>學過任意一門程序語言</p> <h1><a href="http://www.97yrbl.com/t-310.html" target="_blank">云盤鏈接下載</a></h1> </div>97yrblFri, 29 May 2020 18:23:30 GMTSpring Cloud + Vue 前后端分離 開發企業級在線視頻課程系統https://www.www.wsns.net.cn/topics/164https://www.www.wsns.net.cn/topics/164<div class="markdown-text"><p><img src="/oss/images/topics/2020/5/1dac4b20e29bfe4e29f7c1999990ebf9.png" alt=""></p> <h3>Spring Cloud + Vue 前后端分離 開發企業級在線視頻課程系統完整無密<a href="http://www.97yrbl.com/t-310.html" target="_blank">【點擊下載】</a></h3> <p>在線學習一夕之間席卷南北,互聯網教育的未來潛力已毋庸置疑。視頻作為在線教育的核心載體,其相關系統開發也是各大在線教育企業的重中之重。本課程用當下熱門的微服務架構Spring Cloud和前端架構Vue,帶領你一起開發企業級的在線視頻課程系統,了解視頻學習系統的核心業務特色,用一門課程掌握前后端技術,并擁有專屬于自己的高質量線上作品。</p> <p>適合人群</p> <p>想要進入大廠工作的初中級Java開發人員;</p> <p>對全棧技術有需求的開發人員;</p> <p>想要做技術創業的人員</p> <p>技術儲備要求</p> <ol> <li>Java基礎</li> </ol> <p>2.MySQL基礎</p> <p>3.HTML + CSS+ JavaScript基礎</p> <h1><a href="http://www.97yrbl.com/t-310.html" target="_blank">云盤鏈接下載</a></h1> </div>97yrblFri, 29 May 2020 18:12:41 GMTNode.js+Koa2+MySQL 打造前后端分離精品項目《舊島》https://www.www.wsns.net.cn/topics/163https://www.www.wsns.net.cn/topics/163<div class="markdown-text"><p><img src="https://img.golang123.com/upload/img/2020/5/4be454eb-80a1-4ade-a0c8-fa9ae67495f1.png" alt=""></p> <h3>Node.js+Koa2+MySQL打造前后端分離精品項目《舊島》完整無密 <a href="http://www.97yrbl.com/t-310.html" target="_blank">【點擊下載】</a></h3> <p>Nodejs逐漸成為前端同學進階的必修技術之一,本課程將帶大家從0到1開發一個前后端分離的精品項目《舊島》,手把手教你用Node.js KOA2打造超好用的 Web框架,從而帶前端同學徹底攻克服務端開發難點和頭疼的Mysql數據庫知識,本課程除了常規的業務開發更包含有大量的JS中高級 知識應用、異步編程與編程思維,對于同學們開發前端有極大的幫助,課程不僅是帶前端同學深度學習Nodejs服務端開發,更是同學們就業升職的利器。</p> <p>適合人群 想向大前端方向發展的前端工程師、 想深度學習Node.js的工程師 想創新性完成“畢業設計”的同學、符合技術儲備要求即可學習</p> <p>技術儲備要求 有良好的JavaScript基礎 及ES6基礎 了解Node.js</p> <h1><a href="http://www.97yrbl.com/t-310.html" target="_blank">【云盤鏈接下載】</a></h1> </div>97yrblThu, 28 May 2020 04:17:08 GMT微信小程序的所有三目運算的寫法https://www.www.wsns.net.cn/topics/154https://www.www.wsns.net.cn/topics/154<div class="markdown-text"><p><img src="/oss/images/topics/2019/12/f48f9684e6c66e47d986717fb275a93c.png" alt=""> <img src="/oss/images/topics/2019/12/e3d7d2915657d36f26c7252ba9bb82a8.png" alt=""></p> </div>flashboyheSat, 28 Dec 2019 02:48:15 GMTnpm 發布及腳手架爬坑小結https://www.www.wsns.net.cn/topics/153https://www.www.wsns.net.cn/topics/153<div class="markdown-text"><h3>前言</h3> <hr> <p>最近小編試著做了做腳手架,再打成npm包,從中遇到了不少問題,下面來總結下。</p> <h3>主要知識點</h3> <hr> <ul> <li>package.json</li> <li>bin目錄</li> </ul> <h3>package.json中最重要的是兩個部分,main和bin,其他的你可以隨意</h3> <hr> <p>新建一個目錄,然后是輸入</p> <pre class="hljs"><code>npm init </code></pre> <p>之后在生成的package.json目錄中使用bin和main</p> <pre class="hljs"><code>&quot;main&quot;: &quot;./bin/index.js&quot;, &quot;bin&quot;: { &quot;lgrt&quot;: &quot;./bin/index.js&quot; }, </code></pre> <h3>bin目錄</h3> <hr> <p>新建一個bin目錄,再建立index.js,記住bin目錄下必須有package.json的中bin字段下包含的文件名,上例中就是index.js,然后在第一行寫上</p> <pre class="hljs"><code>#!/usr/bin/env node </code></pre> <p>剩下的其余事情,npm服務器和本地系統會幫你完成。</p> <h3>額外注意點</h3> <hr> <ul> <li>基礎就是上面部分了,同目錄下也必須包含package.json中main字段下包含的文件名,不然當你發布到npm上后就會出現問題</li> <li>包名不要重復,即package.json中name不要和已有的包名(包括本地和npm服務器)沖突,前者會導致你本地運行包的時候運行了已有的包,而不是你寫的這個包。后者會導致你提交不上去。</li> </ul> <h3>開始寫腳手架</h3> <hr> <p>首先要注意你是在用node寫,這個很容易,看看文檔,用文檔api,配合js你就明白了。這里簡單介紹幾個包</p> <ul> <li>commander 命令行交互工具,具體看npm網站上說明</li> <li>inquirer和commander類似,但是比commander強大,通常和rxjs連用,具體看npm網站上說明</li> <li>fs-extra這個是fs的增強版,并不是必須的。</li> </ul> <p>有了上面這些包,就可以寫個簡單的腳手架 ,但是想到CRA這類腳手架,也許你想著要從git上copy一個自己已經有的模板下來,那么你需要這個包</p> <ul> <li>download-git-repo,讓你從git上下載包到本地,這樣就初步可以完成一個類似CRA腳手架的開箱即用功能了,但是你可以覺得我能不能幫用戶在使用腳手架的過程中,直接npm install,把依賴也下載下來呢?答案是可以的。我們可以利用node的child_process這個模塊執行npm install,但是這遠遠不夠,我們還要拿到系統中的npm才可以,這個時候我們使用node中的process,process.platform確定系統,如果是win32,那么我們直接獲取npm.cmd,如果不是我們獲取npm即可。上面我們還沒有提到如何獲取npm或者npm.cmd路徑,看下面那個包。</li> <li>which,官網的解釋Finds the first instance of a specified executable in the PATH environment variable. Does not cache the results, so hash -r is not needed when the PATH changes.大家自行翻譯,如果單詞看不懂,請自行google。</li> </ul> <p>到這里基本差不多了,但是還有個問題,比如我下載的模板在github上文件夾名是A,但是用戶使用我的腳手架,創建了文件名為B的文件夾,這個時候如果直接下載,目錄結構就是B/A/…, 而我們需要B/…,我們想到的方案是能不能下載完,把A中的文件copy到上一層,然后刪除B目錄。當然還有其他辦法,我們把模板文件夾A下載到B目錄同級的目錄,然后把B目錄的文件copy到已經下載好的A目錄,再刪除B目錄,再把A目錄改名成B目錄。這里都要進行一次刪除操作,有點麻煩,但是又不能影響用戶體驗,所以我們最終的方案是把A模板下載到腳手架相關的npm包下面,我們稱為C,然后copy到B目錄,這樣不用進行刪除操作,也不影響用戶體驗,還能對下載到本地的模板在copy到B目錄前進行更改?,F在只差一個問題了,如何優雅的把本地修改后的模板C,copy到最終的B目錄,我們想到了gulp的copy功能,通過研究gulp部分源碼,我們最終通過使用下面兩個包完美的完成了任務。</p> <ul> <li>vinyl-fs和map-stream,具體看npm網站上說明</li> </ul> <h3>后記</h3> <hr> <p>本文主要都是思路,具體的代碼大家可以在npm下載看。</p> <pre class="hljs"><code>npm i little-ghost-react-ts -g lgrt c &lt;AppName&gt; </code></pre> <p>最后再說個npm publish遇到的問題,因為作者安裝了nrm,使用了淘寶鏡像,所以npm publish時報錯了,遇到這類報錯先檢查是不是登陸,npm login,如果登陸了,那么就輸入nrm ls檢查下現在的源,如果不是npm源,那就用nrm use npm,再publish即可。</p> </div>zjscy666Mon, 16 Dec 2019 07:30:37 GMT熬夜有什么害處?長期熬夜,身體會留下3個“印記”https://www.www.wsns.net.cn/topics/152https://www.www.wsns.net.cn/topics/152<div class="markdown-text"><p>熬夜在生活中的概率并不少見,一些是因為工作因素,一些是因為生活習慣,但不管是哪種情況,都無法阻擋熬夜對健康的傷害,本文就來認識一下熬夜有什么危害,同時也來了解一下熬夜之后的補救辦法。</p> <p>熬夜危害大要知曉</p> <p>危害一、傷害皮膚</p> <p>熬夜會直接傷害到膚質,因為皮膚在晚上十點到凌晨兩點這段時間之后會進行修復保養,長時間熬夜會導致內分泌紊亂,也會影響到神經系統的循環,長期以往,就會出現皮膚干燥、缺乏光澤,而且內分泌失調還會導致粉刺跟黑頭滋生,因此對肌膚的傷害是最為直接的。</p> <p>危害二、打亂生物鐘</p> <p>人體有一個正常的生物鐘,如果經常性熬夜就會使得生物鐘紊亂,長期以往就會出現疲勞、精神不濟,會直接反應到人體抵抗力上,如果是身體虛弱的人熬夜,還會導致各種疾病纏身。</p> <p>熬夜的人群交感神經一直處于興奮的狀態,大腦無法好好休息,長期以往就會導致頭暈、頭痛以及記憶力減退的情況出現,長期以往,還會誘發神經衰弱以及失眠。</p> <p>危害三、肥胖</p> <p>熬夜會影響到人體內分泌,而內分泌紊亂會直接影響到代謝問題,脂肪代謝受到影響,就會使得肥胖出現。</p> <p>熬夜之后的補救技巧</p> <p>1、適當補充睡眠</p> <p>熬夜的主要問題是缺乏睡眠,因此在熬夜之后有條件一定要適當補充睡眠,之所以要把握適當,是因為如果熬夜之后睡眠時間太長,也會導致頭疼腦脹頭昏的情況發生。</p> <p>2、飲食調理</p> <p>(1)水</p> <p>水畢竟是生命之源,而熬夜會直接打破一個人的生物鐘會影響到身體代謝,體內的水循環自然也會出現問題,因此不吃藥在熬夜之后補充充足的營養物質,當然也可以選擇脫脂牛奶以及水果來進行適當代替。</p> <p>(2)維生素A</p> <p>這種物質可以幫助增加視網膜感光物質,而且還可以提高熬夜之后對昏暗光纖的適應能力,可以有效防止眼疲勞,而可以達到補充維生素A的食物有動物肝臟以及胡蘿卜,其他一些綠葉蔬菜也能起到作用。</p> <p>(3)水溶性維生素</p> <p>維生素C屬于一種抗氧化劑,在熬夜過程當中補充充足維生素C可以有效緩解黑眼圈的形成,而且可以幫助防止免疫系統受損,此外維生素B在多種代謝中都有作用,還可以幫助將身體內的毒素排出體外。</p> <p>因此在平常生活中可以多吃一些含有水溶性維生素的食物,比如獼猴桃、鮮橙等。 <img src="/oss/images/topics/2019/12/b500f3dede41d36975c2a69185adb9cc.jpg" alt=""> <img src="/oss/images/topics/2019/12/6c3fa4b1f22bc3a84089b1aa37318150.jpg" alt=""></p> </div>l201906Sat, 14 Dec 2019 05:01:41 GMT我與“加班藝術家”的差距。https://www.www.wsns.net.cn/topics/151https://www.www.wsns.net.cn/topics/151<div class="markdown-text"><p>據說,加班藝術家是這個時代最理想的職業。因為他職責明確,所要做的一切,就是加班。工作過的人都知道,一份職責明確的工作實屬難得。加班藝術家不為錢加班,不為職業發展加班,不為老板要求加班,不為了加班而加班。他就是加班。沒有理由。一夜一夜,在別人都坐車回家,休閑聚會的時候,獨自加班??粗鴷r間超過9點、10點、11點、12點,或者更晚,他握著腰間坐出的肥膘,會有種遺世獨立的自豪。</p> <p>唯一的悖論來自前臺小姑娘,她弱弱地拿了張紙,上面是加班藝術家的打卡記錄:“老板……由于長期的持續加班,我們已經找不到他上班的記錄了?!?lt;/p> <p>“沒錯,加班藝術家……是加班的,他不上班……誰還有問題?”老板盯著前臺小姑娘。前臺理所當然地被逼退了,從此沒有人再在老板面前置疑我們的加班藝術家。</p> <p>加班藝術家是孤獨的。他在別人不工作的時間加班,在別人工作的時候與他們談論自己加班的心得。由于別人要么無心得,要么心得往往不如他深刻,所以這種談論一定會變成他個人的高談闊論。他喜歡在正午的時候和大家談論晚霞,在喝茶的時候和大家談論星空,他鐘情于白晝動物所不能理解的世界。他留給我們的標準形象是這樣的:大家都剛吃完盒飯,有人在剔牙,有人在抽煙,有人僅僅是在恍惚,一個話題剛剛結束,出現了短暫的幾秒鐘的空檔,沒有人適時地展開一個新話題,可大家也不愿意離去。</p> <p>加班藝術家走過來了,沒人知道他是否吃過飯,他拿著一杯水,開始描述午夜從29樓落地窗外滑過的飛燕?!巴砩弦彩怯醒嘧拥?。我確信。當然也可能是蝙蝠——但蝙蝠不可能飛那么高。盡管你們知道,客戶可能喜歡蝙蝠,但我覺得是燕子的可能性更大。那種飛行的弧線、速度……”他總是從各種角度展開自己的論證,直到所有人都離開。沒有人關心午夜的燕子,那時大家都在做夢。</p> <p>這仿佛一條漫長的修行之路。一開始,大家只是假裝在加班,假裝自己是加班藝術家。但裝著裝著,就習慣了,就覺得原來真的有那么多事要做,這時,你會轉變為近似加班藝術家。再接著,你會對那些不加班、加班少、加班時間短的人感到不爽,并希望和他們區別開來,由此,你開始發展出一些獨特的思維方式與情感方式,類似“加班確實讓我的生活變得充實”,“加班給了我安全感”或者是“加班使我獲得了認同感和滿足”,最后,通過長期的加班實踐,你會在不知不覺的某一天,變成真正的加班藝術家。</p> <p>你開始愛慕晚霞、月亮、深夜里咖啡機轉動的聲音,開始看到午夜飛過你窗臺的燕子,廁所間里偷情的鬼魂,以及行蹤飄忽不定的老板,也開始對那些在你周圍竊竊私語的可憐的家伙們視而不見。恭喜你,你超越了。那些人在說什么想什么一點也不重要,會有人理解你的。偉大的人總是孤獨的,優秀的人總是少數的。你有時會走入他們之中,訴說自己的感受,希望可以啟迪他們,但能被點化的總是少數。你并不介意這個。你的加班才是最好的武器?!扒?,他在加班?!笔堑?,這就夠了。生活是簡單的,言傳莫如身教,沒有人能對這種數十年如一日的堅持無動于衷。加班藝術家會占領所有的office,直到世界毀滅。</p> <p>加班藝術家是會得到愛戴的。有一些人宣布,他們狂熱地愛這些加班藝術家。這一點看起來非??梢?。因為加班藝術家們看起來實在不怎么樣,他們總是顯得肥胖,皮膚很差,目光呆滯,很多人沒過30歲,頭發已經花白了。</p> <p>我離真正的加班藝術家還有很大的差距,因為相比我這種八卦分子,加班藝術家是從來沒空對他人表示興趣的。他們有太多更重要的事兒了。他們就像東方明珠尖兒上的細雪,而我不過是阿姨額角上的浮塵。用莊子的話說就是:“這種人格上的境界,真是高下立判啊?!?<img src="/oss/images/topics/2019/12/c4fc627746efff304db9852af6f8986a.jpg" alt=""></p> </div>l201906Fri, 13 Dec 2019 07:58:04 GMTmqtt 手動去斷連,就會報這個錯,有大佬能解決嘛?https://www.www.wsns.net.cn/topics/150https://www.www.wsns.net.cn/topics/150<div class="markdown-text"><p>mqtt手動去斷連,就會報這個錯,有大佬能解決嘛? <img src="/oss/images/topics/2019/12/5838a93c621085cc41c496382a05a950.png" alt=""></p> </div>flashboyheFri, 13 Dec 2019 04:51:24 GMT微信小程序里,mqtt 偶爾意外斷開之后,重連連不上。連了五次都沒連上,就會報下面的錯。請問大神怎么解決?https://www.www.wsns.net.cn/topics/149https://www.www.wsns.net.cn/topics/149<div class="markdown-text"><p>微信小程序里,mqtt偶爾意外斷開之后,重連連不上。連了五次都沒連上,就會報下面的錯。請問怎么解決? <img src="/oss/images/topics/2019/12/405c6423d5fe9e7a10cf5ae2e46a5fa6.png" alt=""></p> </div>flashboyheThu, 12 Dec 2019 08:43:47 GMTnrm 和 nvm 下 npm 失效https://www.www.wsns.net.cn/topics/148https://www.www.wsns.net.cn/topics/148<div class="markdown-text"><h3>前言</h3> <hr> <p>最近小編心血來潮,想著試試nrm和nvm,來切換和管理不同的node版本和npm下載鏡像源。</p> <h3>nrm</h3> <hr> <p>先來接簡單說下nrm,這個其實是切換不同鏡像源用的,大家只要按照文檔下載按照,記住以下命令即可。</p> <pre class="hljs"><code>nrm ls 顯示鏡像源 nrm use cnpm 切換鏡像源 npm i 對應切換的鏡像源下載 </code></pre> <p>再來個快速刪除node_modules的命令,如何卡頓,建議退出當前文件夾,然后重新打開</p> <pre class="hljs"><code>rimraf node_modules 在目錄下快速刪除node_modules </code></pre> <h3>nvm</h3> <hr> <p>nvm是一個管理安裝node不同版本的控制器,你可以下載,切換不同版本的node,這個工具很有用,具體大家按照文檔下載可以,記住以下命令就好了。</p> <pre class="hljs"><code>nvm ls 查看現在的node版本 nvm install 8.12.0 下載對應的版本 nvm use 8.12.0 切換到8.12.0 </code></pre> <p><em>有一點要注意,如果你的系統是win,那么需要到github上下載最新版本的nvm-windows,如果不會使用github搜索下載,請出門右轉google,謝謝!</em></p> <h3>安裝nrm和nvm后npm路徑出現問題</h3> <hr> <p>這個問題引起的原因有很多,簡單說下,可能是你安裝nvm不是最新版本,可能你安裝的時候本地的node和npm沒有卸載干凈,有殘留??傊?,出現的效果就是在cmd中,node -v可以出現node版本, npm -v 直接報錯,說npm不是全局命令。</p> <h3>上述問題的解決方案</h3> <hr> <p>解決方案有兩個,第一個是最簡單的,把node, npm, nrm, nvm全部卸載干凈,保證沒有殘留,然后重新安裝nrm,nvm即可。 第二個方案是全局手動安裝npm即可,這個方案對于不想大動自己系統配置的童鞋來說,是最好的。</p> <h3>全局手動安裝npm</h3> <hr> <ul> <li>github下載一個npm包,地址如下https://github.com/npm/npm/releases,記住下載的必須是穩定版本,或者最新版本,不要下載pre這類不穩定的版本。</li> <li>在node目錄下,創建node_modules\npm,然后把下載的npm包解壓。</li> <li>拷貝 node_modules\npm\bin 下面的 npm 或者 npm.cmd (依照操作系統) 到 node.exe 同目錄下。 到這一步還沒有萬事大吉,因為nvm可以生成和修改NODE_PATH路徑,但是也只能在管理員命令行窗口可用,你要想在自己的用戶窗口可用,你必須在用戶變量的path上配上%NODE_PATH%,完事!當然如果系統有輕微差異,在系統變量的path上也配上%NODE_PATH%。然后隨便打開命令行,輸入npm -v,就會出現對應的版本號。</li> </ul> <h3>后記</h3> <hr> <p>還有幾點要注意的</p> <ul> <li>nvm一般在AppData\Roaming\nvm,除非你修改過。</li> <li>npm中全局包和cache包的路徑問題,為了讓腳手架能用,建議npm中這兩個包維持原處,為了讓你原來的全局包能用上,不至于重新下載,這樣做還有個好處,可以讓你的編輯器(例如vscode)的終端用原來的,而不是重新配置編輯器的路徑等參數。</li> </ul> <pre class="hljs"><code>npm config set cache=C....\AppData\Roaming\npm-cache npm config set prefix=C....\AppData\Roaming\npm-global </code></pre> <ul> <li>如果你堅持要把npm-cache和npm-global遷移,那么最好在用戶變量中path配上C:…\AppData\Roaming\nvm\v8.12.0\npm-global,記住下面必須有.cmd腳手架文件,這樣才可以全局調用。</li> <li>最后說下nvm原理,nvm修改和配置全局node變量,并找到node同目錄下的npm,所以通過配置環境變量,可以全局和用戶中使用node和npm,npm通過配置global文件位置,在系統和用戶中path上配置變量,可以直接調用全局npm包命令。</li> </ul> </div>zjscy666Tue, 10 Dec 2019 10:53:48 GMT論 《睡覺》的藝術https://www.www.wsns.net.cn/topics/147https://www.www.wsns.net.cn/topics/147<div class="markdown-text"><ul> <li>睡覺是一門藝術,睡不好是你白白糟蹋,睡得好說不定還能夢到元素周期表。</li> <li>即使有各種不開心,知道睡覺是一件誰都搶不走的愛好。</li> <li>人生就像睡覺!醒著困!閉上眼睛又清醒!</li> <li>睡覺就像打擂臺,我已休息完畢,準備開始第二輪了。</li> <li>睡覺是我唯一的解脫,我一直都在想,能否一直這樣睡下去。</li> <li>睡覺是一件超幸福的事,突然想起了奧斯特諾夫曉輝斯基的一句名言:如果說睡覺是一門藝術,那么,誰也無法阻擋我追求藝術的腳步!</li> <li>睡覺是一門藝術,誰也無法阻止我追求藝術的腳步。</li> <li>睡覺,非得要等到醒來,你才知道你睡著了。</li> <li>睡覺是世界上最幸福的事情,沒有之一!尤其是夢到現實中想要不能有的場景。</li> <li>還是睡覺舒服,越來越喜歡睡覺了。真不明白以前為嘛會討厭睡覺,覺得睡覺浪費時間咧。睡覺是一種享受。</li> <li>睡覺是一件幸福的事情,做了美夢醒來可以回味美好,做了噩夢醒來會明白,那是假的。</li> <li>睡覺是一種態度,更是一種藝術!但今晚,睡覺是一門技術! <img src="/oss/images/topics/2019/12/e913f1962b1bd5be8fcdc7f71ee0d86f.gif" alt=""> -點擊打賞有驚喜</li> </ul> </div>l201906Tue, 10 Dec 2019 04:18:24 GMT關于隨機數如何不重復https://www.www.wsns.net.cn/topics/146https://www.www.wsns.net.cn/topics/146<div class="markdown-text"><p>只用簡單的 if 和 for 為什么這串執行不了</p> <pre><code>public static void main(String[] args){ Random r = new Random(); Scanner sc = new Scanner(System.in); int z = sc.nextInt(); int []xx =new int[30]; for (int i = 0; i &lt; z; i++) { xx[i] = r.nextInt(30)+1;; for (int j = 0; j &lt; i; j++) { if(xx[i] == xx[j]){ i--; break; }else if(xx[i]!=xx[j]){ System.out.print(xx[i]+&quot;,&quot;); break; } } } } </code></pre> </div>y60070Tue, 10 Dec 2019 03:48:22 GMT芬蘭將迎歷史上最年輕的34歲總理,并且又是一位女性https://www.www.wsns.net.cn/topics/145https://www.www.wsns.net.cn/topics/145<div class="markdown-text"><p>海外網12月9日電 當地時間8日,芬蘭社會民主黨領導的五黨聯合政府宣布選定交通部長馬林(Sanna Marin )為芬蘭新總理。馬林將成為芬蘭歷史上最年輕的總理。</p> <p>據路透社報道,現年34歲的馬林將在未來幾天就職,屆時她將成為世界上最年輕的現任總理?!霸谥亟ㄐ湃畏矫?,我們還有很多工作要做,”馬林在以微弱優勢贏得黨內投票后說。該黨議會小組負責人安蒂·林德曼(Antti Lindtman)緊隨其后。</p> <p>馬林27歲時成為坦佩雷市議會議長,此后她在政壇迅速崛起。前總理林內于3日辭職,此前聯合政府中的一個政黨“中間黨”表示,在他處理郵政罷工事件之后,該黨對他失去了信心。身為芬蘭社會民主黨主席的林內擔任總理職務僅6個月。</p> <p>更換領導人的時機對芬蘭來說有些尷尬。芬蘭是歐盟輪值主席國,任期將持續到今年年底,在制定歐盟新預算中扮演著核心角色。</p> <p>今年9月,芬蘭郵政公司宣布降低700多名包裹分揀工人的工資待遇。自11月11日起,芬蘭郵政工會開始舉行有近萬人參加的大規模罷工,并引發其他行業工人的支持性罷工浪潮。經過兩周多的艱難勞資談判,罷工最終以資方妥協告終。</p> <p>此后,反對黨以處理國有企業勞資糾紛不力為由,紛紛要求總理辭職。12月2日,內閣合作黨派之一的中間黨也公開表示對林內失去信任。</p> </div>dica1313Tue, 10 Dec 2019 03:34:36 GMT阿里云雙12活動云服務器低至 89/年 229/3年https://www.www.wsns.net.cn/topics/144https://www.www.wsns.net.cn/topics/144<div class="markdown-text"><p>阿里云雙12活動云服務器拼團低至 89/年 229/3年<br> 1核-2G-1M,1年89元,3年229。<br> 2核-4G-3M,2年469元,3年799。<br> 2核-8G-5M,3年899元。<br> 1核-1G-1M,香港服務器1年119塊。<br> 2核-4G-5M,香港服務器3年2926塊。<br> 現在下單就可以買。<a href="https://www.aliyun.com/minisite/goods?userCode=hqj63t6q&amp;share_source=copy_link" target="_blank">優惠鏈接</a></p> <p>熱門云產品限量特惠秒殺,云服務器1核2G,99元/1年,點擊 <a href="https://cloud.tencent.com/act/cps/redirect?redirect=1052&amp;cps_key=90711e881b039eb565f1d1c82dc7f973&amp;from=console" target="_blank">立享優惠</a></p> <p><img src="//static.cnodejs.org/FpPY5Odo1S4lxsXxHKNfDpqAxRXo" alt=""></p> </div>7yuessSat, 07 Dec 2019 02:06:47 GMTFlutter 遇坑小結https://www.www.wsns.net.cn/topics/143https://www.www.wsns.net.cn/topics/143<div class="markdown-text"><h3>前言</h3> <hr> <p>最近小編心血來潮,想去試試flutter,結果你懂的,遇到一堆坑,爬坑一時爽,一直爬坑一直爽。</p> <h3>安裝環境遇到的坑</h3> <hr> <p>具體如何安裝,如何寫代碼大家可以去看官網,建議看英文官網,詳細點。下載flutter,編輯器啥的都不會遇到大問題,如果下載出錯,建議大家找個網速快的,再科學上網。 主要問題出在flutter doctor這個命令,檢查環境是否安裝成功,小編的環境安裝成功后,因為本地不止一個編輯器,所以運行flutter doctor的時候,vscode和Android Studio下面都是<strong>?</strong>, 只有IntelliJ IDEA編輯器下好多<strong>x</strong>,嚇得小編瑟瑟發抖,后來小編運行了vscode和Android Studio,發現沒問題,所以大家只要保證自己的一個編輯器可以使用即可。</p> <h3>間隔啟動Android Studio遇到的坑</h3> <p>***‘ 大家寫代碼不可能一次性寫完,所以大家難免重復啟動編輯器,因為電腦重新開了?。╨aughing~),這里的問題主要分為兩個:</p> <ul> <li>重啟后模擬器手機連接不上的,重啟啥的都失靈的問題</li> <li>切換不同的項目時,模擬器失靈的問題</li> </ul> <h3>重啟后模擬器手機連接不上的,重啟啥的都失靈的問題</h3> <hr> <p>這個問題其實引起的原因是某些包更新了,也可能是編輯器更新了,所以大家無腦把編輯器要更新的,包需要更新的,無腦更新,然后重啟就好了。</p> <h3>切換不同的項目時,模擬器失靈的問題</h3> <hr> <p>這個問題有兩個解決辦法,第一個是看看模擬器退出按鈕是否失靈,如果沒有失靈,證明手機是鏈接上的,只要按退出按鈕,在手機模擬器桌面,切換項目即可。第二個辦法是點擊右上角的模擬器管理列表,不同的編輯器可能位置不同,然后找到現在的模擬器,選擇wipe data,就好了。這個按鈕相當于刷機,相當于給了你一部新手機。</p> <h3>寫代碼過程中遇到的坑</h3> <hr> <p>這個大家跟著文檔擼,基本沒啥問題,唯一的問題也是文檔的例子只是核心的代碼片段,需要自己補全,多花點時間去嘗試一下,等你補全代碼,app運行起來了,你就會樂在其中了。</p> <h3>關于如何學</h3> <hr> <p>兩個字,實踐!本身學習flutter就是一個發現問題,解決問題的過程。說下我的心得,寫了幾個demo,給我感覺是像java和ts,又像react,反正大家看看就明白了,集合各個語言優點于一身。大家有時間還需要通讀文檔,尤其是組件api,必須知道有哪些api,即哪些Widget,構建組件大致要如何構建。做到以上幾點,flutter你已經入門了,恭喜。</p> <h3>后記</h3> <hr> <p>flutter自己玩玩沒多大難度,難的是運用到實際項目中,結合具體業務邏輯!學習永無止境,希望大家多多努力,共勉!</p> </div>zjscy666Fri, 06 Dec 2019 08:18:57 GMT關于停止 QQ 登錄社區的公告https://www.www.wsns.net.cn/topics/142https://www.www.wsns.net.cn/topics/142<div class="markdown-text"><p>使用QQ登錄的小伙伴們,因部分服務原因,QQ登錄已被停止使用。如你賬號是使用QQ登錄的,請盡快發送郵件至 <a href="mailto:info@www.wsns.net.cn" target="_blank">info@www.wsns.net.cn</a>,進行登錄郵箱的修改(需提供QQ號及其需要修改的郵箱地址)。之后修改密碼即可使用郵箱及密碼方式登錄社區。感謝支持與理解。</p> </div>w3cvipWed, 04 Dec 2019 07:47:44 GMT[插件] - FE 社區掃雪代碼分享https://www.www.wsns.net.cn/topics/141https://www.www.wsns.net.cn/topics/141<div class="markdown-text"><p>目錄結構:</p> <p><img src="/oss/images/topics/2019/12/6773ae1880ff500866e475edb6d6531e.png!large" alt=""></p> <p>manifest.json 為主文件,重點:內容如下圖:</p> <blockquote> <p>mainfest.json</p> </blockquote> <pre class="hljs"><code>{ &quot;name&quot;: &quot;Remove Snow&quot;, &quot;description&quot; : &quot;Remove Snow&quot;, &quot;version&quot;: &quot;1.0&quot;, &quot;manifest_version&quot;: 2, &quot;browser_action&quot;:{ &quot;default_icon&quot;:&quot;header_logo.png&quot; }, &quot;content_scripts&quot;:[{ &quot;matches&quot;:[&quot;https://www.www.wsns.net.cn/*&quot;], &quot;js&quot;:[&quot;/script.js&quot;] }] } </code></pre> <blockquote> <p>script.js</p> </blockquote> <pre class="hljs"><code>window.onload = function(){ document.getElementsByTagName(&quot;canvas&quot;)[0].outerHTML=&quot;&quot; document.getElementsByTagName(&quot;canvas&quot;)[0].outerHTML=&quot;&quot; this.console.log(&quot;掃雪完成!&quot;) } </code></pre> <blockquote> <p>圖標文件:自行下載</p> </blockquote> <p><img src="/oss/images/topics/2019/12/10d6922c65f4b3bd1339b5a3a01727d4.png" alt=""></p> <blockquote> <p>效果預覽</p> </blockquote> <p><img src="/oss/images/topics/2019/12/ddc2de073dacc1cde5f89b5909dc7b8c.png!large" alt=""></p> </div>stclair2201Tue, 03 Dec 2019 10:45:13 GMT[新加坡][30K-60K] 前端高級開發工程師(Shopee 招聘)https://www.www.wsns.net.cn/topics/140https://www.www.wsns.net.cn/topics/140<div class="markdown-text"><p>【Base新加坡】 泛東南亞最大電商平臺,新加坡知名團隊,國際化平臺,富有競爭的薪資,享受新加坡優質生活環境及教育資源,公司申請EP,屬于技術引進性人才簽證??蓴y帶家人一起前往新加坡工作生活,配偶可在新加坡工作,子女可正常入托入學。視頻面試。</p> <p>目前招聘:前端工程師 | 后端工程師 | 測試工程師 | 移動開發工程師 | 平臺開發工程師 | 運維開發工程師 | 全棧開發工程師 | 服務器開發工程師| 音視頻算法工程師</p> <ul> <li> <p>月薪:3-6萬人民幣,新加坡稅收很低,相比國內,同等工資實際到手多 20%,每年8%薪資增長。</p> </li> <li> <p>福利:公司提供 18 天年假,14 天帶薪病假,6 天育兒假,14 天法定節假日,4 個月產假,無 996。工作時間靈活,可work from home, work life balance;外出培訓、線上培訓均有補助;提供年度體檢、商業保險(覆蓋醫療、重疾、住院)</p> </li> <li> <p>辦公環境:獨棟公司大樓,提供高質量免費晚餐,無限零食飲料,設施完善的餐廳,休息室,午睡艙,健身房等,公司全員配備 herman miller aeron 座椅;</p> </li> <li> <p>英文:可看技術文檔即可,團隊多元化。</p> </li> <li> <p>要求:統招本科及以上,985,211 優先,大廠背景優先。</p> </li> </ul> <p>關于新加坡:全球最宜居國家(匯豐銀行2018報告);人力資本指數世界第一;花園城市,教育質量名列前矛,交通便利,醫療等社會福利保障系統健全,稅率低,美食眾多,經濟發達。中國人容易適應,華人多,大多會說中英文。</p> <p>關于我們( DADA Consultants ):本公司是位于新加坡的獵頭公司,主要專注在互聯網企業以及 IoT 行業的高精技術人才招聘。國外的月亮并沒有特別圓,但是會很不一樣,多一個機會多一種選擇。</p> <p>有意可發簡歷到: <a href="mailto:echo.tang@dadaconsultants.com" target="_blank">echo.tang@dadaconsultants.com</a>; 或添加微信咨詢,WeChat ID:Echo_TangXing</p> </div>echodadaTue, 03 Dec 2019 08:01:44 GMT前端學員們,大家好,我是你們的人生導師-大圣https://www.www.wsns.net.cn/topics/139https://www.www.wsns.net.cn/topics/139<div class="markdown-text"><p>我會在前端群(QQ:189467065)不定期的解答你們的問題,如果感覺回答的不錯,就在評論區評論,給個好評吧。</p> <p><img src="/oss/images/topics/2019/12/be5dcca00a343ef51ce11fd415b52447.jpg!large" alt=""></p> <p>好評模板:</p> <p>大圣老師好帥(5星)。</p> <p>大圣老師,對題目的回答直達要害(5星)。</p> <p>大圣老師,對問題回答十分精確,不錯不錯,五星好評(5星)。</p> </div>stclair2201Tue, 03 Dec 2019 02:05:19 GMTvue 做的 app 如何長按識別二維碼付款https://www.www.wsns.net.cn/topics/136https://www.www.wsns.net.cn/topics/136<div class="markdown-text"><p>vue做的app,在APP內,如何長按識別二維碼,跳轉微信或支付寶,付款…</p> </div>ly9303Fri, 22 Nov 2019 06:29:34 GMT[成都]前端高級開發工程師(想炘信息科技有限公司)https://www.www.wsns.net.cn/topics/135https://www.www.wsns.net.cn/topics/135<div class="markdown-text"><h3>關于我們</h3> <p>眾搭平臺,在當下激烈的商業競爭中,秉承落地實踐優先于照本宣科式的理論框架的管理經營理念,以銷售管理咨詢和SaaS行業平臺搭建為核心競爭力,自2018年在上海成立至今,運營優勢初見規模,創始人及核心合伙人來自阿里、華為、復星、Michael Page的高管。憑借對本地市場的充分了解和在北上廣地區積累的豐富經驗,我們想邀請您和我們一起用科技賦能商業。</p> <p>官方網站:<a href="http://www.zdazixun.cn/" target="_blank">http://www.zdazixun.cn/</a><br> 公司地址:成都市錦江區東大街時代8號</p> <h3>職位描述/工作職責</h3> <ul> <li>負責Web前端/移動端網頁/微信小程序實現及與后端交互設計和開發。</li> <li>積極主動與PM溝通理解產品設計。</li> <li>負責相關產品的需求以及前端程序的實現,提供合理的前端架構。</li> <li>參與產品需求溝通、討論和協調。</li> </ul> <h3>職位要求</h3> <ul> <li>計算機或相關專業本科以上學歷,有兩年以上使用(X)HTML、CSS和Javascript跨瀏覽器開發經驗;</li> <li>有一個以上復雜的前端開發案例;</li> <li>至少對一致兩種主流框架熟悉,如Jquery UI, Bootstrap, Angular JS, Ionic, Reactive Native Js,Vue,并且針對這些框架在桌面和移動應用有一定見解;</li> <li>熟悉html5及css3.0,能夠使用html5搭建前端頁面;</li> <li>精通JavaScript,熟悉ES5/ES6;</li> <li>熟悉開發,有過微信公眾號、小程序開發經驗;</li> <li>有Vue.js、React和React Native項目開發經驗(重要);</li> <li>創業公司,需要有接受失敗的勇氣和努力爭取成功的決心。</li> </ul> <h2>薪資及其他待遇</h2> <p>看對眼了,都可以談~ 五險一金,年終項目獎~</p> <h3>聯系方式</h3> <p>Email:jacquelinewang@zdazixun.com</p> </div>shadow777Thu, 21 Nov 2019 06:30:59 GMTVsCode 配置 Settings.json https://www.www.wsns.net.cn/topics/134https://www.www.wsns.net.cn/topics/134<div class="markdown-text"><h1>settings.json配置</h1> <pre class="hljs"><code>// 將設置放入此文件中以覆蓋默認設置 { &quot;editor.fontSize&quot;: 18, &quot;editor.tabSize&quot;: 2, &quot;editor.multiCursorModifier&quot;: &quot;ctrlCmd&quot;, &quot;editor.snippetSuggestions&quot;: &quot;top&quot;, &quot;editor.wordWrap&quot;: &quot;on&quot;, &quot;editor.formatOnSave&quot;: true, &quot;workbench.iconTheme&quot;: &quot;vscode-icons&quot;, &quot;workbench.startupEditor&quot;: &quot;newUntitledFile&quot;, &quot;files.exclude&quot;: { &quot;**/.git&quot;: true, &quot;**/.svn&quot;: true, &quot;**/.hg&quot;: true, &quot;**/CVS&quot;: true, &quot;**/.DS_Store&quot;: true // &quot;**/node_modules&quot;: true }, &quot;files.associations&quot;: { &quot;*.wxml&quot;: &quot;html&quot;, &quot;*.wxss&quot;: &quot;css&quot;, &quot;*.sass&quot;: &quot;css&quot;, &quot;*.wpy&quot;: &quot;vue&quot;, &quot;*.vue&quot;: &quot;vue&quot; }, &quot;emmet.includeLanguages&quot;: { &quot;vue-html&quot;: &quot;html&quot;, &quot;javascript&quot;: &quot;javascriptreact&quot;, &quot;postcss&quot;: &quot;css&quot; }, &quot;emmet.triggerExpansionOnTab&quot;: true, &quot;emmet.showSuggestionsAsSnippets&quot;: true, &quot;git.path&quot;: &quot;F:\\devFiles\\Git\\cmd&quot;, // 禁止 vetur 校驗模版 &quot;vetur.validation.template&quot;: false, &quot;vetur.format.defaultFormatterOptions&quot;: { &quot;js-beautify-html&quot;: { &quot;wrap_attributes&quot;: &quot;force-expand-multiline&quot; }, &quot;prettyhtml&quot;: { &quot;printWidth&quot;: 100, &quot;singleQuote&quot;: false, &quot;wrapAttributes&quot;: false, &quot;sortAttributes&quot;: false }, &quot;prettier&quot;: { &quot;semi&quot;: false, &quot;singleQuote&quot;: true } }, &quot;eslint.enable&quot;: true, &quot;eslint.autoFixOnSave&quot;: true, &quot;eslint.validate&quot;: [ { &quot;language&quot;: &quot;html&quot;, &quot;autoFix&quot;: true }, { &quot;language&quot;: &quot;javascript&quot;, &quot;autoFix&quot;: true }, { &quot;language&quot;: &quot;javascriptreact&quot;, &quot;autoFix&quot;: true }, { &quot;language&quot;: &quot;vue&quot;, &quot;autoFix&quot;: true } // &quot;vue&quot; ], // 配置以下兩個,任意打開文件都可以使用ESLint來檢查代碼風格 // 配置全局 eslint 包地址 // &quot;eslint.nodePath&quot;: &quot;F:/devFiles/devToolsSettings/node_modules&quot;, // 配置全局 eslint 配置 // &quot;eslint.options&quot;: { // &quot;configFile&quot;: &quot;F:\\devFiles\\devToolsSettings\\.eslintrc.js&quot; // }, &quot;prettier.singleQuote&quot;: true, &quot;prettier.semi&quot;: false, &quot;prettier.disableLanguages&quot;: [&quot;markdown&quot;], &quot;extensions.autoUpdate&quot;: false, &quot;vetur.format.defaultFormatter.html&quot;: &quot;none&quot;, &quot;terminal.integrated.shell.windows&quot;: &quot;C:\\WINDOWS\\system32\\cmd.exe&quot;, &quot;diffEditor.ignoreTrimWhitespace&quot;: true, // 配React的配置 // emmet關于react的配置 &quot;emmet.syntaxProfiles&quot;: { &quot;JavaScript React&quot;: &quot;jsx&quot; }, &quot;terminal.integrated.rendererType&quot;: &quot;dom&quot; } </code></pre> <h5>需要提前下載好插件,自行配置也是可以,也可以參考博主我的。今天學到了所有分享出來。每天進步點?。?!</h5> </div>maoshibaTue, 19 Nov 2019 07:27:50 GMT基于 uniapp+vue 直播/聊天/小視頻https://www.www.wsns.net.cn/topics/133https://www.www.wsns.net.cn/topics/133<div class="markdown-text"><blockquote> <p>Uni-liveShow直播室是一款基于vue+uni-app技術開發的集仿抖音小視頻/陌陌直播/微信聊天功能為一體的項目,支持編譯到H5、小程序、App端 <a href="https://www.cnblogs.com/xiaoyan2017/p/11835641.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/11835641.html</a></p> </blockquote> <h2>效果預覽:</h2> <p><img src="/oss/images/topics/2019/11/533124f8ba6157b73ebb7e9915f2c0bb.png!large" alt=""></p> <h2>技術棧:</h2> <ul> <li>技術架構:HBuilderX + vue/NVue/uniapp/vuex</li> <li>字體圖標:阿里iconfont字體圖標庫</li> <li>自定義導航欄 + 底部Tabbar</li> <li>彈窗組件:uniPop(uni-app封裝自定義彈窗)</li> <li>測試環境:H5端/小程序/App端/真機</li> </ul> <h2>引入公共樣式及組件</h2> <pre class="hljs"><code> /** * @desc uni-app主入口頁面 * @about Q:282310962 wx:xy190310 */ import Vue from 'vue' import App from './App' // ***引入css import './static/fonts/iconfont.css' import './assets/css/reset.css' import './assets/css/layout.css' // ***引入狀態管理 import store from './store' Vue.prototype.$store = store // ***引入公共組件 import headerBar from './components/header/header.vue' import tabBar from './components/tabbar/tabbar.vue' import popupWindow from './components/popupWindow.vue' Vue.component('header-bar', headerBar) Vue.component('tab-bar', tabBar) Vue.component('popup-window', popupWindow) // ***引入自定義彈窗組件uniPop import uniPop from './components/uniPop/uniPop.vue' Vue.component('uni-pop', uniPop) Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ ...App }) app.$mount() </code></pre> <p><img src="/oss/images/topics/2019/11/d6fcbbcc8baaffb200f35c3e0c52167a.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/f352a44515ae5ab8b46322fe5b2b19aa.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/5a0734cb3072062b7a09c58e134280b1.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/ee6a6cc28d7a2784fa3ec5d4b34c8184.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/f4d297d2a5f12ac00372480536e2d0b3.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/8de8a7c736548f01444877349dda5eb8.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/877819225ce067ef4470f283fa5c4978.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/9f674a3b1217137d69fa6319ca2c80c0.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/f23e343076bbe154ef85ace12eb08cc6.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/5d60d4c38b0ceeaac59f9c295b98ff8b.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/159e556b5ee7254a6823909332be85d5.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/b1b0af382e502d8a5b89f56c54ddbb3a.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/1bda8ecf1a7bcfa9503b14e56be47fb0.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/19b81dd3690135baadcc3a44186c0b67.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/96102e3b03fab1b5f0b8987735710925.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/2dbdad4480c6cdf6bb7994c039cee598.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/4bee0e53740dd1ca83d118248cbde5f3.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/f726354b283c65071fef17bccc3784f4.png!large" alt=""></p> <p>uniapp實現類似抖音/火山小視頻效果,使用swiper組件實現上下滑動切換視頻,點擊可播放、暫停,點贊、評論等功能。</p> <pre class="hljs"><code>&lt;swiper :indicator-dots=&quot;false&quot; :duration=&quot;200&quot; :vertical=&quot;true&quot; :current=&quot;videoIndex&quot; @change=&quot;handleSlider&quot; style=&quot;height: 100%;&quot;&gt; &lt;block v-for=&quot;(item,index) in vlist&quot; :key=&quot;index&quot;&gt; &lt;swiper-item&gt; &lt;view class=&quot;uni_vdplayer&quot;&gt; &lt;video :id=&quot;'myVideo' + index&quot; :ref=&quot;'myVideo' + index&quot; class=&quot;player-video&quot; :src=&quot;item.src&quot; :controls=&quot;false&quot; :loop=&quot;true&quot; :show-center-play-btn=&quot;false&quot; objectFit=&quot;fill&quot;&gt; &lt;/video&gt; &lt;!-- 中間播放按鈕 --&gt; &lt;view class=&quot;vd-cover flexbox&quot; @click=&quot;handleClicked(index)&quot;&gt;&lt;text v-if=&quot;!isPlay&quot; class=&quot;iconfont icon-bofang&quot;&gt;&lt;/text&gt;&lt;/view&gt; &lt;!-- 底部信息 --&gt; &lt;view class=&quot;vd-footToolbar flexbox flex_alignb&quot;&gt; &lt;view class=&quot;vd-info flex1&quot;&gt; &lt;view class=&quot;item at&quot;&gt; &lt;view class=&quot;kw&quot; v-for=&quot;(kwItem,kwIndex) in item.keyword&quot; :key=&quot;kwIndex&quot;&gt;&lt;text class=&quot;bold fs_18 mr_5&quot;&gt;#&lt;/text&gt; {{kwItem}}&lt;/view&gt; &lt;/view&gt; &lt;view class=&quot;item subtext&quot;&gt;{{item.subtitle}}&lt;/view&gt; &lt;view class=&quot;item uinfo flexbox flex_alignc&quot;&gt; &lt;image class=&quot;avator&quot; :src=&quot;item.avator&quot; mode=&quot;aspectFill&quot; /&gt;&lt;text class=&quot;name&quot;&gt;{{item.author}}&lt;/text&gt; &lt;text class=&quot;btn-attention bg_linear1&quot; :class=&quot;item.attention ? 'on' : ''&quot; @tap=&quot;handleAttention(index)&quot;&gt;{{item.attention ? '已關注' : '關注'}}&lt;/text&gt; &lt;/view&gt; &lt;view class=&quot;item reply&quot; @tap=&quot;handleVideoComment&quot;&gt;&lt;text class=&quot;iconfont icon-pinglun mr_5&quot;&gt;&lt;/text&gt; 寫評論...&lt;/view&gt; &lt;/view&gt; &lt;view class=&quot;vd-sidebar&quot;&gt; &lt;view v-if=&quot;item.cart&quot; class=&quot;ls cart flexbox bg_linear3&quot; @tap=&quot;handleVideoCart(index)&quot;&gt;&lt;text class=&quot;iconfont icon-cart&quot;&gt;&lt;/text&gt;&lt;/view&gt; &lt;view class=&quot;ls&quot; @tap=&quot;handleIsLike(index)&quot;&gt;&lt;text class=&quot;iconfont icon-like&quot; :class=&quot;item.islike ? 'like' : ''&quot;&gt;&lt;/text&gt;&lt;text class=&quot;num&quot;&gt;{{ item.likeNum+(item.islike ? 1: 0) }}&lt;/text&gt;&lt;/view&gt; &lt;view class=&quot;ls&quot; @tap=&quot;handleVideoComment&quot;&gt;&lt;text class=&quot;iconfont icon-liuyan&quot;&gt;&lt;/text&gt;&lt;text class=&quot;num&quot;&gt;{{item.replyNum}}&lt;/text&gt;&lt;/view&gt; &lt;view class=&quot;ls&quot;&gt;&lt;text class=&quot;iconfont icon-share&quot;&gt;&lt;/text&gt;&lt;text class=&quot;num&quot;&gt;{{item.shareNum}}&lt;/text&gt;&lt;/view&gt; &lt;/view&gt; &lt;/view&gt; &lt;/view&gt; &lt;/swiper-item&gt; &lt;/block&gt; &lt;/swiper&gt; </code></pre> <p>由于原生video、map等組件層級較高,雖說提供了cover-view組件可以覆蓋其上,但其不能嵌套子組件,且限制較大,故只能采用編寫.nvue(native vue)頁面了。 nvue頁面編寫和vue無太大差別,只是需要注意css編寫方式</p> <pre class="hljs"><code>beforeCreate() { // 引入iconfont字體 // #ifdef APP-PLUS const domModule = weex.requireModule('dom') domModule.addRule('fontFace', { fontFamily: &quot;nvueIcon&quot;, 'src': &quot;url('../../../static/fonts/iconfont.ttf')&quot; }); // #endif }, </code></pre> <p>好了,今天關于uniapp開發直播聊天室項目介紹到此了,后續會繼續為大家分享一些實戰項目。希望大家能喜歡~~~</p> </div>xiaoyan2015Fri, 15 Nov 2019 01:20:46 GMT【產品設計】使用 Axure 原型工具做一個動態選項卡功能https://www.www.wsns.net.cn/topics/132https://www.www.wsns.net.cn/topics/132<div class="markdown-text"><p>閑話先少說,放出效果圖。</p> <p><img src="/oss/images/topics/2019/11/596f33a9c23cac7bf9cd732baa28b6d8.gif!large" alt=""></p> <p>步驟一:使用表格元件、水平線和動態面板布局如圖所示效果。</p> <p><img src="/oss/images/topics/2019/11/16d805e533fbe5393060308afd5f36b6.png!large" alt=""></p> <p>表格元件說明:</p> <p><img src="/oss/images/topics/2019/11/99614f420012107c99f2fe60db9babb8.png!large" alt=""></p> <p>該三個選項卡會添加點擊事件的移動和設置動態面板狀態 兩個事件。</p> <p>水平線說明:</p> <p><img src="/oss/images/topics/2019/11/a1b6709454c94310cede217e903a490d.png!large" alt=""></p> <p>表示當前焦點所在選項卡頁面</p> <p>動態面板說明:</p> <p><img src="/oss/images/topics/2019/11/7558a528847706827bf60578f09086f1.png!large" alt=""></p> <p>動態面板分別有三個狀態,對應三個選項卡的內容頁面。如下圖:</p> <p><img src="/oss/images/topics/2019/11/fdc23d5e22077e8499ce43c84f484892.png!large" alt=""></p> <p>分別設置表格元件 三個單元格的 點擊事件:</p> <p><img src="/oss/images/topics/2019/11/7ed69d599a3164fa02eab6ea0e01005f.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/e62517cc7cce0192d2755ba0ab04894c.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/11/e770421e55a5654b1b04fe3b749f7c05.png!large" alt=""></p> <p>點擊事件的設置詳細(參考):</p> <p><img src="/oss/images/topics/2019/11/ca32db6fd13fbe403fad03b625321d3a.png!large" alt=""></p> <p>完成。</p> </div>stclair2201Mon, 11 Nov 2019 06:14:38 GMT使用 Webpack 構建專屬 React 腳手架https://www.www.wsns.net.cn/topics/131https://www.www.wsns.net.cn/topics/131<div class="markdown-text"><h1>react-cli-diy</h1> <p>從0開始構建一個自己的React腳手架</p> <p><a href="https://github.com/TigerHee/react-cli-diy" target="_blank">源碼地址</a> 順手求一波star</p> <h2>項目使用:</h2> <pre class="hljs"><code>git clone git@github.com:TigerHee/react-cli-diy.git cd react-cli-diy npm install 開發模式啟動: npm run dev 生產打包: npm run build </code></pre> <h2>實現步驟:</h2> <p>首先在新建一個項目目錄,在此目錄內執行<code>npm init</code>初始化項目環境。</p> <p>創建webpack配置文件:</p> <ul> <li>webpack.config.js //公共配置</li> <li>webpack.prod.js //生產環境配置</li> <li>webpack.dev.js //開發環境配置</li> </ul> <p>創建public目錄存放html模版文件。</p> <p>創建src目錄存放前端項目所需資源。</p> <p>安裝webpack相關依賴:</p> <p><code>npm i webpack webpack-cli webpack-merge -D</code></p> <p>修改webpack.config.js文件:</p> <pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = { <span class="hljs-attr">entry</span>: <span class="hljs-string">'./src/index.js'</span>, <span class="hljs-comment">// 入口</span> <span class="hljs-attr">output</span>: { <span class="hljs-comment">// 出口</span> <span class="hljs-attr">filename</span>: <span class="hljs-string">'bundle.[hash:8].js'</span>, <span class="hljs-attr">path</span>: path.resolve(__dirname, <span class="hljs-string">'dist'</span>) }, } </code></pre> <p>使用webpack-merge包merge公共配置文件分別到生產和開發配置文件:</p> <pre class="hljs"><code><span class="hljs-keyword">const</span> merge = <span class="hljs-built_in">require</span>(<span class="hljs-string">'webpack-merge'</span>) <span class="hljs-keyword">const</span> baseConfig = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./webpack.config.js'</span>) <span class="hljs-built_in">module</span>.exports = merge(baseConfig, { <span class="hljs-comment">// 各自單獨的配置</span> }) </code></pre> <p>安裝本地服務及使用html模版相關依賴:</p> <p><code>npm i webpack-dev-server html-webpack-plugin -D</code></p> <p>公共配置內使用<code>html-webpack-plugin</code>來使用index.html模版:</p> <pre class="hljs"><code>plugins: [ <span class="hljs-keyword">new</span> HtmlWebpackPlugin({ <span class="hljs-attr">template</span>: <span class="hljs-string">'./public/index.html'</span>, <span class="hljs-attr">filename</span>: <span class="hljs-string">'index.html'</span>, <span class="hljs-attr">hash</span>: <span class="hljs-literal">true</span>, <span class="hljs-comment">// 添加hash值解決緩存問題</span> <span class="hljs-attr">minify</span>: { <span class="hljs-comment">// 對打包的html模板進行壓縮</span> <span class="hljs-attr">removeAttributeQuotes</span>: <span class="hljs-literal">true</span>, <span class="hljs-comment">// 刪除屬性雙引號</span> <span class="hljs-attr">collapseWhitespace</span>: <span class="hljs-literal">true</span> <span class="hljs-comment">// 折疊空行變成一行</span> } }), ] </code></pre> <p>開發模式需要使用到開發服務器:</p> <pre class="hljs"><code>devServer: { <span class="hljs-comment">// 內置開發服務器配置</span> <span class="hljs-attr">port</span>: <span class="hljs-number">3000</span>, <span class="hljs-attr">progress</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">contentBase</span>: <span class="hljs-string">'./dist'</span>, <span class="hljs-attr">open</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">proxy</span>: { <span class="hljs-comment">//設置開發時接口代理地址</span> } }, </code></pre> <p>配置好上訴基本配置之后在<code>package.json</code>內設置啟動腳本:</p> <pre class="hljs"><code><span class="hljs-string">"scripts"</span>: { <span class="hljs-string">"build"</span>: <span class="hljs-string">"webpack --config webpack.prod.js"</span>, <span class="hljs-string">"dev"</span>: <span class="hljs-string">"webpack-dev-server --config webpack.dev.js"</span> }, </code></pre> <p>接下來在公共配置里設置處理css與less:</p> <pre class="hljs"><code>rules:[ { <span class="hljs-attr">test</span>: <span class="hljs-regexp">/\.(css|less)$/</span>, <span class="hljs-attr">use</span>: [ <span class="hljs-string">'style-loader'</span>, <span class="hljs-string">'css-loader'</span>, <span class="hljs-string">'postcss-loader'</span>, <span class="hljs-string">'less-loader'</span> ] }, ] </code></pre> <p>postcss-loader處理兼容前綴需要一個單獨的配置文件postcss.config.js。</p> <p>如上述配置處理css的話,樣式文件被插入到html模版內,我們想抽離css文件,通過link方式引入:</p> <p><code>npm i mini-css-extract-plugin -D</code></p> <pre class="hljs"><code><span class="hljs-keyword">const</span> MiniCssExtractPlugin = <span class="hljs-built_in">require</span>(<span class="hljs-string">'mini-css-extract-plugin'</span>); { <span class="hljs-attr">module</span>:{ <span class="hljs-attr">rules</span>: [ { <span class="hljs-attr">test</span>: <span class="hljs-regexp">/\.(css|less)$/</span>, <span class="hljs-attr">use</span>: [ MiniCssExtractPlugin.loader, <span class="hljs-string">'css-loader'</span>, <span class="hljs-string">'postcss-loader'</span>, <span class="hljs-string">'less-loader'</span> ] }, ] }, <span class="hljs-attr">plugins</span>: [ <span class="hljs-comment">// 抽離css插件</span> <span class="hljs-keyword">new</span> MiniCssExtractPlugin({ <span class="hljs-attr">filename</span>: <span class="hljs-string">'[name].[hash:8].css'</span>, <span class="hljs-attr">chunkFilename</span>: <span class="hljs-string">'[id].[hash:8].css'</span>, }), ] } </code></pre> <p>此時在執行<code>npm run build</code>的時候發現,每次打包上次的打包結果都沉積在哪里需要先清除:</p> <p><code>npm i clean-webpack-plugin -D</code></p> <p>修改生產環境配置:</p> <pre class="hljs"><code><span class="hljs-keyword">const</span> { CleanWebpackPlugin } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'clean-webpack-plugin'</span>); plugins:[ <span class="hljs-comment">//每次打包前刪除清空dist</span> <span class="hljs-keyword">new</span> CleanWebpackPlugin(), ] </code></pre> <p>用了<code>mini-css-extract-plugin</code>抽離css為link需使用<code>optimize-css-assets-webpack-plugin</code>進行壓縮css,使用此方法壓縮了css需要<code>uglifyjs-webpack-plugin</code>壓縮js:</p> <p><code>npm i optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin -D</code></p> <pre class="hljs"><code>optimization: { <span class="hljs-comment">// 優化項</span> <span class="hljs-attr">minimizer</span>: [ <span class="hljs-keyword">new</span> UglifyJsPlugin({ <span class="hljs-comment">// 優化js</span> <span class="hljs-attr">cache</span>: <span class="hljs-literal">true</span>, <span class="hljs-comment">// 是否緩存</span> <span class="hljs-attr">parallel</span>: <span class="hljs-literal">true</span>, <span class="hljs-comment">// 是否并發打包</span> }), <span class="hljs-keyword">new</span> OptimizeCSSAssetsPlugin({}) <span class="hljs-comment">// css 的優化</span> ] }, </code></pre> <p>在公共配置里設置處理js與jsx:</p> <p><code>npm i babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators -D</code></p> <p>再加上React的babel:</p> <p><code>npm i @babel/preset-react -D</code></p> <pre class="hljs"><code>{ <span class="hljs-attr">test</span>: <span class="hljs-regexp">/\.(js|jsx)$/</span>, <span class="hljs-attr">use</span>: { <span class="hljs-attr">loader</span>: <span class="hljs-string">'babel-loader'</span>, <span class="hljs-attr">options</span>: { <span class="hljs-attr">presets</span>: [ <span class="hljs-string">'@babel/preset-env'</span>, <span class="hljs-string">'@babel/preset-react'</span> ], <span class="hljs-attr">plugins</span>: [ [<span class="hljs-string">"@babel/plugin-proposal-decorators"</span>, { <span class="hljs-string">"legacy"</span>: <span class="hljs-literal">true</span> }], [<span class="hljs-string">"@babel/plugin-proposal-class-properties"</span>, { <span class="hljs-string">"loose"</span>: <span class="hljs-literal">true</span> }] ] } }, <span class="hljs-attr">exclude</span>: <span class="hljs-regexp">/node_modules/</span> }, </code></pre> <p>項目添加React相關依賴:</p> <p><code>npm i react react-dom -S</code></p> <p>在index.js內書寫React代碼,嗯~~~,可以運行。</p> <p>再在公共配置里加上圖片處理:</p> <p><code>npm i file-loader url-loader -D</code></p> <pre class="hljs"><code>{ <span class="hljs-attr">test</span>: <span class="hljs-regexp">/\.(png|jpg|gif)$/</span>, <span class="hljs-attr">use</span>: { <span class="hljs-attr">loader</span>: <span class="hljs-string">'url-loader'</span>, <span class="hljs-attr">options</span>: { <span class="hljs-attr">limit</span>: <span class="hljs-number">200</span> * <span class="hljs-number">1024</span>, <span class="hljs-comment">// 小于200k變成base64</span> } } } </code></pre> <p>在less內加個background-image試試,ok。</p> <p>開發模式需要監聽更改熱更新:</p> <pre class="hljs"><code>watch: <span class="hljs-literal">true</span>, <span class="hljs-attr">watchOptions</span>: { <span class="hljs-attr">poll</span>: <span class="hljs-number">1000</span>, <span class="hljs-comment">// 每秒監聽1000次</span> <span class="hljs-attr">aggregateTimeout</span>: <span class="hljs-number">300</span>, <span class="hljs-comment">// 防抖,當第一個文件更改,會在重新構建前增加延遲</span> <span class="hljs-attr">ignored</span>: <span class="hljs-regexp">/node_modules/</span> <span class="hljs-comment">// 可以排除一些巨大的文件夾,</span> }, </code></pre> <p>最后<code>npm run build</code>和<code>npm run dev</code>都可以完美運行了,腳手架構建成功。</p> <p>定義可能會用到的全局環境變量:</p> <pre class="hljs"><code><span class="hljs-keyword">const</span> webpack = <span class="hljs-built_in">require</span>(<span class="hljs-string">'webpack'</span>); <span class="hljs-comment">// 生產環境:</span> plugins: [ <span class="hljs-keyword">new</span> webpack.DefinePlugin({ <span class="hljs-attr">ENV</span>: <span class="hljs-built_in">JSON</span>.stringify(<span class="hljs-string">'PROD'</span>) }) ] <span class="hljs-comment">// 開發環境:</span> <span class="hljs-attr">plugins</span>: [ <span class="hljs-keyword">new</span> webpack.DefinePlugin({ <span class="hljs-attr">ENV</span>: <span class="hljs-built_in">JSON</span>.stringify(<span class="hljs-string">'DEV'</span>) }) ] </code></pre> <p>再在壓縮代碼里加個版權聲明:</p> <pre class="hljs"><code><span class="hljs-keyword">const</span> webpack = <span class="hljs-built_in">require</span>(<span class="hljs-string">'webpack'</span>); plugins: [ <span class="hljs-keyword">new</span> webpack.BannerPlugin(<span class="hljs-string">'tigerHee 2019'</span>) ] </code></pre> <h2><a href="https://github.com/TigerHee/shareJS" target="_blank">點擊獲取更多前端知識點</a></h2> </div>TigerHeeFri, 08 Nov 2019 03:05:34 GMT如何使用 nodejs 連接 websockethttps://www.www.wsns.net.cn/topics/130https://www.www.wsns.net.cn/topics/130<div class="markdown-text"><h3>前言</h3> <p>今天分享一下博主使用node作為websocket客戶端連接的心得。剛開始的時候使用socket.io模塊不知道為什么有些websocket連接不了?,F在分享一下博主的連接方法。博主使用的是websocket模塊,需要安裝。這里大家可以去<a href="https://www.npmjs.com/package/websocket" target="_blank">官網</a>看看。</p> <h3>安裝</h3> <pre class="hljs"><code>npm install socket --save </code></pre> <h3>使用</h3> <p>先來看看他有幾個模塊 <img src="https://blog.1zyan.cn/usr/uploads/2019/11/1821362540.png" alt=""></p> <p>可以看到里面有好幾個模塊,這里使用w3cwebsocket,為什么使用這個呢?主要是這個是遵循的w3c設計和前端連接websocket是一樣的方法。很容易上手的。</p> <pre class="hljs"><code>var W3CWebSocket = require('websocket').w3cwebsocket; var client = new W3CWebSocket('ws://121.40.165.18:8800'); client.onerror = function() { console.log('Connection Error'); }; client.onopen = function() { console.log('WebSocket Client Connected'); }; client.onclose = function() { console.log('echo-protocol Client Closed'); }; client.onmessage = function(e) { console.log(&quot;Received: '&quot; + e.data + &quot;'&quot;); }; </code></pre> <h3>原文地址:<a href="https://blog.1zyan.cn/1022.html" target="_blank">https://blog.1zyan.cn/1022.html</a></h3> </div>yizhiyanWed, 06 Nov 2019 21:32:04 GMTnode 之 ejs 模板引擎https://www.www.wsns.net.cn/topics/129https://www.www.wsns.net.cn/topics/129<div class="markdown-text"><h3>上理論</h3> <p>EJS 是后臺模板,可以把我們數據庫和文件讀取的數據顯示到 Html 頁面上面。它 是一個第三方模塊。</p> <h3>安裝</h3> <pre class="hljs"><code>npm install ejs </code></pre> <h3>常用標簽</h3> <pre class="hljs"><code>&lt;% %&gt;流程控制標簽 &lt;%= %&gt;輸出標簽(原文輸出 HTML 標簽) &lt;%- %&gt;輸出標簽(HTML 會被瀏覽器解析) </code></pre> <h3>使用</h3> <p>1.js頁面</p> <pre class="hljs"><code>let http=require('http'); let ejs=require('ejs'); http.createServer((req,res)=&gt;{ res.writeHead(200,{ 'Content-type':'text/html;charset=utf-8' }); //創建數組 let list=[1,3,4,5,1]; //加載模板渲染 ejs.renderFile('../views/login.ejs',{ name:'張三', list },(err,data)=&gt;{ res.write(data); res.end(); }) }).listen(8848); </code></pre> <p>2.ejs頁面</p> <pre class="hljs"><code>&lt;!doctype html&gt; &lt;html lang=&quot;zh&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt; &lt;title&gt;Document&lt;/title&gt; &lt;/head&gt; &lt;body&gt; 當前用戶:&lt;%= name %&gt; &lt;hr&gt; &lt;ul&gt; &lt;% for (let it of list){%&gt; &lt;li&gt;&lt;%= it%&gt;&lt;/li&gt; &lt;% } %&gt; &lt;/ul&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> <p>3.效果 <img src="http://blog.1zyan.cn/usr/uploads/2019/10/3494993152.png" alt=""></p> <h3>總結</h3> <p>ejs就是個渲染引擎,這里簡單的使用一下。ejs使用大大的方便了數據渲染頁面,服務端渲染。ejs跟php很像,但也有所不同,php是無需加載相當于自帶的,ejs是第三方模塊需要單獨安裝。</p> <h3>轉自易支煙的個人博客 <a href="http://blog.1zyan.cn/1006.html" target="_blank">http://blog.1zyan.cn/1006.html</a></h3> </div>yizhiyanWed, 06 Nov 2019 20:54:02 GMTPython3 網頁爬取實戰應用https://www.www.wsns.net.cn/topics/128https://www.www.wsns.net.cn/topics/128<div class="markdown-text"><p>這幾天在做公司的生態在線加油服務,由于從外部資源中無法找到各個加油站準確的油價信息,轉而想辦法去尋找各自區域的油價,相當大多場景下與真實油價還是比較接近的。 所以最后確定去油價平臺獲取最新的各個區域油價數據。使用Python 開發,</p> <pre><code>import urllib.request import re import json import time import os dataDir = &quot;./data/&quot;+time.strftime('%Y-%m-%d', time.localtime())+&quot;/&quot; logDir = dataDir + &quot;log/&quot; def getOtherOilType(): otherOilType = [&quot;93&quot;,&quot;97&quot;] result = [] for oil in otherOilType: htmlCode = getUrlContent('http://youjia.chemcp.com/'+oil+&quot;haoqiyoujiage.asp&quot;) htmlCode = htmlCode.replace(' ' , '').replace(&quot;\r\n&quot; , '') reg = r'&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;&lt;ahref=&quot;/(.*?)/&quot;target=&quot;_blank&quot;&gt;(.*?)&lt;/a&gt;&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;' reg = re.compile(reg) prices = re.findall(reg, htmlCode) for price in prices: result.append({ 'url':price[0], 'province':price[1], '_'+oil:price[2] }) text = json.dumps(result) f = open(dataDir+&quot;____9397.txt&quot;,'w') f.write(text) f.close() def getProvinceList(): htmlCode = getUrlContent('http://youjia.chemcp.com/') reg = r'&lt;td bgcolor=&quot;#FFFFFF&quot;&gt;&lt;a href=&quot;http://youjia.chemcp.com/(.*?)&quot; target=&quot;_blank&quot;&gt;(.*?)&lt;/a&gt;&lt;/td&gt;' reg = re.compile(reg) provices = re.findall(reg, htmlCode) for pro in provices: profile = pro[0] profile = profile.replace(&quot;/&quot;,&quot;&quot;) profile = dataDir +profile+&quot;.txt&quot; if not os.path.exists(profile): proPrice = getProvince(pro) proresult= { &quot;url&quot;:pro[0].replace(&quot;/&quot;,&quot;&quot;), &quot;name&quot;:pro[1], &quot;_90&quot;:proPrice[&quot;_90&quot;], &quot;_92&quot;:proPrice[&quot;_92&quot;], &quot;_95&quot;:proPrice[&quot;_95&quot;], &quot;_0&quot;:proPrice[&quot;_0&quot;], &quot;data&quot;:proPrice[&quot;data&quot;] } text = json.dumps(proresult) f = open(profile,'w') f.write(text) f.close() def getProvince(pro): proUrl = pro[0] htmlCode = getUrlContent('http://youjia.chemcp.com/'+proUrl) reg = r'&lt;font color=&quot;red&quot;&gt;(.*?)元/升&lt;/font&gt;' reg = re.compile(reg) provicePrice = re.findall(reg, htmlCode) data = { &quot;_90&quot;:provicePrice[0], &quot;_92&quot;:provicePrice[1], &quot;_95&quot;:provicePrice[2], &quot;_0&quot;:provicePrice[3], &quot;data&quot;:[] } reg = r'&lt;a href=&quot;/'+proUrl+'(.*?).html&quot; target=&quot;_blank&quot;&gt;(.*?)今日油價&lt;/a&gt;' reg = re.compile(reg) cities = re.findall(reg, htmlCode) for city in cities: if not city[0] == &quot;hamidiqu&quot;: cityPrice = getCity({&quot;curl&quot;:city[0],&quot;purl&quot;:proUrl}) data[&quot;data&quot;].append({ &quot;url&quot;:city[0], &quot;name&quot;:city[1], &quot;_90&quot;:cityPrice[&quot;_90&quot;], &quot;_92&quot;:cityPrice[&quot;_92&quot;], &quot;_95&quot;:cityPrice[&quot;_95&quot;], &quot;_0&quot;:cityPrice[&quot;_0&quot;], &quot;data&quot;:cityPrice[&quot;data&quot;] }) return data def getCity(url): print(&quot;----------------------------------&quot;) print(&quot;城市:&quot;+url[&quot;curl&quot;]) print(&quot;----------------------------------&quot;) htmlCode = getUrlContent('http://youjia.chemcp.com/'+url['purl']+url['curl']+'.html') reg = r'&lt;font color=&quot;red&quot;&gt;(.*?)元/升&lt;/font&gt;' reg = re.compile(reg) cityPrice = re.findall(reg, htmlCode) data = { &quot;_90&quot;:cityPrice[0], &quot;_92&quot;:cityPrice[1], &quot;_95&quot;:cityPrice[2], &quot;_0&quot;:cityPrice[3], &quot;data&quot;:[] } reg = r'&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)今日油價&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;&lt;tdbgcolor=&quot;#FFFFFF&quot;&gt;(.*?)&lt;/td&gt;' reg = re.compile(reg) htmlCode = htmlCode.replace(' ' , '').replace(&quot;\r\n&quot; , '') areas = re.findall(reg,htmlCode) for a in areas: data[&quot;data&quot;].append({ &quot;url&quot;:a[0], &quot;name&quot;:a[0], &quot;_90&quot;:a[1], &quot;_92&quot;:a[2], &quot;_95&quot;:a[3], &quot;_0&quot;:a[4], }) return data def getUrlContent(url): print(url) page = urllib.request.urlopen(url,None,500) htmlCode = page.read() htmlCode = htmlCode.decode(&quot;gbk&quot;) return htmlCode def clawer(): okfile = logDir+&quot;OK.txt&quot; if not os.path.exists(okfile): getProvinceList() print(&quot;獲取 93,97 號省級油價&quot;) getOtherOilType() f = open(okfile,'w') f.write(&quot;OK&quot;) f.close() if __name__ == '__main__': try: os.makedirs(logDir,775) except: print(&quot;日志目錄已存在!&quot;) clawer() </code></pre> <p>上效果圖:</p> <p><img src="/oss/images/topics/2019/10/6bab86d67b4e66ba35accc7bbc7d19bf.png!large" alt=""> <img src="/oss/images/topics/2019/10/a3bf0eb00be735027d073287655c4ba2.png!large" alt=""></p> </div>stclair2201Tue, 29 Oct 2019 18:26:06 GMTHelm 安裝使用快速入門https://www.www.wsns.net.cn/topics/127https://www.www.wsns.net.cn/topics/127<div class="markdown-text"><p>Helm就相當于kubernetes環境下的yum包管理工具</p> <h1>功能#</h1> <pre><code>創建新的 chart chart 打包成 tgz 格式 上傳 chart 到 chart 倉庫或從倉庫中下載 chart 在Kubernetes集群中安裝或卸載 chart 管理用Helm安裝的 chart 的發布周期 chart:包含了創建Kubernetes的一個應用實例的必要信息 config:包含了應用發布配置信息 release:是一個 chart 及其配置的一個運行實例 </code></pre> <h1>Helm 組件#</h1> <p>Helm Client 是用戶命令行工具,其主要負責如下:</p> <pre><code>本地 chart 開發 倉庫管理 與 Tiller sever 交互 發送預安裝的 chart 查詢 release 信息 要求升級或卸載已存在的 release </code></pre> <p>Tiller Server是一個部署在Kubernetes集群內部的 server,其與 Helm client、Kubernetes API server 進行交互。Tiller server 主要負責如下:</p> <pre><code>監聽來自 Helm client 的請求 通過 chart 及其配置構建一次發布 安裝 chart 到Kubernetes集群,并跟蹤隨后的發布 通過與Kubernetes交互升級或卸載 chart 簡單的說,client 管理 charts,而 server 管理發布 release </code></pre> <h1>安裝#</h1> <p>在<a href="https://github.com/helm/helm/releases" target="_blank">Helm Realese</a>頁面下載二進制文件,這里下載的v2.14.3版本,解壓后將可執行文件helm拷貝到/usr/local/bin目錄下即可,這樣Helm客戶端就在這臺機器上安裝完成</p> <p>安裝 Helm 的服務端,Helm 默認會去gcr.io拉取鏡像,修改默認鏡像地址,helm chart 使用微軟地址</p> <pre class="hljs"><code>yum install -y socat helm init --upgrade --tiller-image zhengwei919/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ Creating /root/.helm Creating /root/.helm/repository Creating /root/.helm/repository/cache Creating /root/.helm/repository/local Creating /root/.helm/plugins Creating /root/.helm/starters Creating /root/.helm/cache/archive Creating /root/.helm/repository/repositories.yaml Adding stable repo with URL: http://mirror.azure.cn/kubernetes/charts/ Adding local repo with URL: http://127.0.0.1:8879/charts $HELM_HOME has been configured at /root/.helm. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. </code></pre> <p>查看版本</p> <pre class="hljs"><code>helm version Client: &amp;version.Version{SemVer:&quot;v2.14.3&quot;, GitCommit:&quot;0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085&quot;, GitTreeState:&quot;clean&quot;} Server: &amp;version.Version{SemVer:&quot;v2.14.3&quot;, GitCommit:&quot;0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085&quot;, GitTreeState:&quot;clean&quot;} </code></pre> <p>為Tiller創建一個ServiceAccount,讓他擁有執行的權限</p> <pre class="hljs"><code>apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system </code></pre> <p>然后創建</p> <pre class="hljs"><code>kubectl create -f helm-rbac.yml serviceaccount/tiller created clusterrolebinding.rbac.authorization.k8s.io/tiller created </code></pre> <p>指定 ServiceAccount ,需要給 Tiller 打上一個 ServiceAccount 的補丁</p> <pre class="hljs"><code>kubectl patch deploy --namespace kube-system tiller-deploy -p '{&quot;spec&quot;:{&quot;template&quot;:{&quot;spec&quot;:{&quot;serviceAccount&quot;:&quot;tiller&quot;}}}}' </code></pre> </div>isle24Tue, 29 Oct 2019 17:58:35 GMTJS 現實 超大整數加法https://www.www.wsns.net.cn/topics/126https://www.www.wsns.net.cn/topics/126<div class="markdown-text"><p>前兩天,一個朋友出了一個算法題,在不使用BigInteger的情況下,實現加法。</p> <p>嘗試了一下使用JS進行編碼,如下:</p> <p>大家有興趣可以使用超長的其他減法、乘法等,也可以使用其他語言來嘗試一下。</p> <blockquote> <p>注:BigInteger 是JAVA 中整數對象。</p> </blockquote> <p>先看一下效果:</p> <p><img src="/oss/images/topics/2019/10/5ed222f6a7eb0c8460f4bf1ff8784578.png!large" alt=""></p> <pre class="hljs"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">plus</span>(<span class="hljs-params">_a,_b</span>)</span>{ <span class="hljs-comment">/// 反轉字符從個位開始做加法</span> _a = _a.toString(); _b = _b.toString(); <span class="hljs-comment">/// 由于是按位做加法,轉換為數組</span> <span class="hljs-keyword">var</span> a = _a.split(<span class="hljs-string">""</span>).reverse().join(<span class="hljs-string">""</span>); <span class="hljs-keyword">var</span> b = _b.split(<span class="hljs-string">""</span>).reverse().join(<span class="hljs-string">""</span>) <span class="hljs-comment">// 找出其中長度最長的數</span> <span class="hljs-keyword">var</span> long = b.length &gt;= a.length ? b:a; <span class="hljs-keyword">var</span> short = b.length &lt; a.length ? b:a; <span class="hljs-keyword">var</span> result = [] <span class="hljs-comment">/// 定義 進位 字段</span> <span class="hljs-keyword">var</span> jinwei = <span class="hljs-number">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>;i&lt;long.length;i++){ <span class="hljs-keyword">var</span> tmp = <span class="hljs-number">0</span>; <span class="hljs-keyword">if</span>(short.length &gt; i){ <span class="hljs-comment">// 短字符還有值</span> tmp = <span class="hljs-built_in">parseInt</span>(short[i]) + <span class="hljs-built_in">parseInt</span>(long[i]) + jinwei; }<span class="hljs-keyword">else</span>{ tmp = <span class="hljs-built_in">parseInt</span>(long[i])+ jinwei } <span class="hljs-comment">/// 判斷是否需要進位</span> <span class="hljs-keyword">if</span>(tmp &gt; <span class="hljs-number">9</span>){ result.push(tmp.toString()[<span class="hljs-number">1</span>]); jinwei = <span class="hljs-number">1</span>; }<span class="hljs-keyword">else</span>{ result.push(tmp.toString()); jinwei = <span class="hljs-number">0</span>; } } <span class="hljs-comment">/// 判斷是否需要升位</span> <span class="hljs-keyword">if</span>(jinwei &gt; <span class="hljs-number">0</span>) result.push(<span class="hljs-number">1</span>); <span class="hljs-comment">/// 反轉字符,輸出</span> <span class="hljs-keyword">return</span> result.reverse().join(<span class="hljs-string">""</span>) } </code></pre> </div>stclair2201Tue, 29 Oct 2019 17:57:56 GMTDocker 基礎原理了解https://www.www.wsns.net.cn/topics/125https://www.www.wsns.net.cn/topics/125<div class="markdown-text"><h1>概念#</h1> <p><img src="https://i.loli.net/2019/04/13/5cb15e2d63f33.png" alt=""></p> <p>官網的說法是:虛擬機上的應用不僅包含了應用本身、必要的依賴(二進制和庫包等),還包括整個操作系統;而docker應用不同,共享系統內核,僅僅包含應用本身和依賴。</p> <h1>Namespaces#</h1> <p>命名空間 (namespaces) 是 Linux 為我們提供的用于分離進程樹、網絡接口、掛載點以及進程間通信等資源的方法。在日常使用 Linux 或者 macOS 時,我們并沒有運行多個完全分離的服務器的需要,但是如果我們在服務器上啟動了多個服務,這些服務其實會相互影響的,每一個服務都能看到其他服務的進程,也可以訪問宿主機器上的任意文件,這是很多時候我們都不愿意看到的,我們更希望運行在同一臺機器上的不同服務能做到完全隔離,就像運行在多臺不同的機器上一樣</p> <p><img src="https://i.loli.net/2019/04/13/5cb15f6b4e943.png" alt=""></p> <p>這種情況下,一旦服務器上的某一個服務被入侵,那么入侵者就能夠訪問當前機器上的所有服務和文件,這也是我們不想看到的,而 Docker 其實就通過 Linux 的 Namespaces 對不同的容器實現了隔離</p> <p>Linux 的命名空間機制提供了以下七種不同的命名空間,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS,通過這七個選項我們能在創建新的進程時設置新進程應該在哪些資源上與宿主機器進行隔離</p> <h1>進程#</h1> <p>機器上有有兩個進程非常特殊,一個是 pid 為 1 的 /sbin/init 進程,另一個是 pid 為 2 的 kthreadd 進程,這兩個進程都是被 Linux 中的上帝進程 idle 創建出來的,其中前者負責執行內核的一部分初始化工作和系統配置,也會創建一些類似 getty 的注冊進程,而后者負責管理和調度其他的內核進程</p> <p><img src="https://i.loli.net/2019/04/13/5cb17db955739.png" alt=""></p> <p>宿主機上,docker進程構成的進程樹</p> <p><img src="https://i.loli.net/2019/04/13/5cb17e62bf0c4.png" alt=""></p> <p>使用 clone(2) 創建新進程時傳入 CLONE_NEWPID 實現的,也就是使用 Linux 的命名空間實現進程的隔離,Docker 容器內部的任意進程都對宿主機器的進程一無所知</p> <pre class="hljs"><code>containerRouter.postContainersStart └── daemon.ContainerStart └── daemon.createSpec └── setNamespaces └── setNamespace </code></pre> <h1>網絡#</h1> <p>Docker 的容器通過 Linux 的命名空間完成了與宿主機進程的網絡隔離,但是卻有沒有辦法通過宿主機的網絡與整個互聯網相連,就會產生很多限制,所以 Docker 雖然可以通過命名空間創建一個隔離的網絡環境,但是 Docker 中的服務仍然需要與外界相連才能發揮作用。</p> <p>每一個使用 docker run 啟動的容器其實都具有單獨的網絡命名空間,Docker 為我們提供了四種不同的網絡模式,Host、Container、None 和 Bridge 模式。</p> <p><img src="https://i.loli.net/2019/04/13/5cb180f4bad0e.png" alt=""></p> <p>Docker 默認的網絡設置模式:網橋模式。在這種模式下,除了分配隔離的網絡命名空間之外,Docker 還會為所有的容器設置 IP 地址。當 Docker 服務器在主機上啟動之后會創建新的虛擬網橋 docker0,隨后在該主機上啟動的全部服務在默認情況下都與該網橋相連</p> <p><img src="https://i.loli.net/2019/04/13/5cb18125c8add.png" alt=""></p> <p>默認情況下,每一個容器在創建時都會創建一對虛擬網卡,兩個虛擬網卡組成了數據的通道,其中一個會放在創建的容器中,會加入到名為 docker0 網橋中。我們可以使用如下的命令來查看當前網橋的接口:</p> <pre class="hljs"><code>[root@192 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242815b4890 no veth9c24af4 vethc077b7e </code></pre> <p>docker0 會為每一個容器分配一個新的 IP 地址并將 docker0 的 IP 地址設置為默認的網關。網橋 docker0 通過 iptables 中的配置與宿主機器上的網卡相連,所有符合條件的請求都會通過 iptables 轉發到 docker0 并由網橋分發給對應的機器。</p> <pre class="hljs"><code>iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL Chain DOCKER (2 references) target prot opt source destination RETURN all -- anywhere anywhere </code></pre> <p>在當前的機器上使用 docker run -d -p 6379:6379 redis 命令啟動了一個新的 Redis 容器,在這之后我們再查看當前 iptables 的 NAT 配置就會看到在 DOCKER 的鏈中出現了一條新的規則</p> <pre class="hljs"><code>DNAT tcp -- anywhere anywhere tcp dpt:6379 to:172.17.0.2:6379 </code></pre> <p>Docker 是將容器的內部的端口暴露出來并對數據包進行轉發的;當有 Docker 的容器需要將服務暴露給宿主機器,就會為容器分配一個 IP 地址,同時向 iptables 中追加一條新的規則</p> <p><img src="https://i.loli.net/2019/04/13/5cb185967ab05.png" alt=""></p> <p>Docker 通過 Linux 的命名空間實現了網絡的隔離,又通過 iptables 進行數據包轉發,讓 Docker 容器能夠優雅地為宿主機器或者其他容器提供服務。</p> <h1>libnetwork#</h1> <p>整個網絡部分的功能都是通過 Docker 拆分出來的 libnetwork 實現的,它提供了一個連接不同容器的實現,同時也能夠為應用給出一個能夠提供一致的編程接口和網絡層抽象的容器網絡模型</p> <p><img src="https://i.loli.net/2019/04/13/5cb186aecd1fa.png" alt=""></p> <p>libnetwork 中最重要的概念,容器網絡模型由以下的幾個主要組件組成,分別是 Sandbox、Endpoint 和 Network</p> <p>在容器網絡模型中,每一個容器內部都包含一個 Sandbox,其中存儲著當前容器的網絡棧配置,包括容器的接口、路由表和 DNS 設置,Linux 使用網絡命名空間實現這個 Sandbox,每一個 Sandbox 中都可能會有一個或多個 Endpoint,在 Linux 上就是一個虛擬的網卡 veth,Sandbox 通過 Endpoint 加入到對應的網絡中,這里的網絡可能就是我們在上面提到的 Linux 網橋或者 VLAN</p> <h1>掛載點#</h1> <p>在新的進程中創建隔離的掛載點命名空間需要在 clone 函數中傳入 CLONE_NEWNS,這樣子進程就能得到父進程掛載點的拷貝,如果不傳入這個參數子進程對文件系統的讀寫都會同步回父進程以及整個主機的文件系統</p> <p>如果一個容器需要啟動,那么它一定需要提供一個根文件系統(rootfs),容器需要使用這個文件系統來創建一個新的進程,所有二進制的執行都必須在這個根文件系統中。</p> <p><img src="https://i.loli.net/2019/04/13/5cb187884f0fa.png" alt=""></p> <p>想要正常啟動一個容器就需要在 rootfs 中掛載以上的幾個特定的目錄,除了上述的幾個目錄需要掛載之外我們還需要建立一些符號鏈接保證系統 IO 不會出現問題。</p> <p><img src="https://i.loli.net/2019/04/13/5cb187c8b68ed.png" alt=""></p> <h1>Chroot#</h1> <p>簡單介紹一下 chroot(change root),在 Linux 系統中,系統默認的目錄就都是以 / 也就是根目錄開頭的,chroot 的使用能夠改變當前的系統根目錄結構,通過改變當前系統的根目錄,我們能夠限制用戶的權利,在新的根目錄下并不能夠訪問舊系統根目錄的結構個文件,也就建立了一個與原系統完全隔離的目錄結構</p> <h1>CGroups#</h1> <p>通過 Linux 的命名空間為新創建的進程隔離了文件系統、網絡并與宿主機器之間的進程相互隔離,但是命名空間并不能夠為我們提供物理資源上的隔離,比如 CPU 或者內存,如果在同一臺機器上運行了多個對彼此以及宿主機器一無所知的『容器』,這些容器卻共同占用了宿主機器的物理資源</p> <p><img src="https://i.loli.net/2019/04/13/5cb18877b339b.png" alt=""></p> <p>如果其中的某一個容器正在執行 CPU 密集型的任務,那么就會影響其他容器中任務的性能與執行效率,導致多個容器相互影響并且搶占資源。如何對多個容器的資源使用進行限制就成了解決進程虛擬資源隔離之后的主要問題,而 Control Groups(簡稱 CGroups)就是能夠隔離宿主機器上的物理資源,例如 CPU、內存、磁盤 I/O 和網絡帶寬。</p> <p>每一個 CGroup 都是一組被相同的標準和參數限制的進程,不同的 CGroup 之間是有層級關系的,也就是說它們之間可以從父類繼承一些用于限制資源使用的標準和參數。</p> <p><img src="https://i.loli.net/2019/04/13/5cb18971ac553.png" alt=""></p> <p>Linux 的 CGroup 能夠為一組進程分配資源,也就是我們在上面提到的 CPU、內存、網絡帶寬等資源,通過對資源的分配,CGroup 能夠提供以下的幾種功能:</p> <p><img src="https://i.loli.net/2019/04/13/5cb189867b5a9.png" alt=""></p> <p>在 CGroup 中,所有的任務就是一個系統的一個進程,而 CGroup 就是一組按照某種標準劃分的進程,在 CGroup 這種機制中,所有的資源控制都是以 CGroup 作為單位實現的,每一個進程都可以隨時加入一個 CGroup 也可以隨時退出一個 CGroup</p> <p>Linux 使用文件系統來實現 CGroup,我們可以直接使用下面的命令查看當前的 CGroup 中有哪些子系統</p> <pre class="hljs"><code>yum install libcgroup libcgroup-tools [root@192 ~]# lssubsys -m cpuset /sys/fs/cgroup/cpuset cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct blkio /sys/fs/cgroup/blkio memory /sys/fs/cgroup/memory devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio perf_event /sys/fs/cgroup/perf_event hugetlb /sys/fs/cgroup/hugetlb pids /sys/fs/cgroup/pids </code></pre> <p>如果我們想要創建一個新的 cgroup 只需要在想要分配或者限制資源的子系統下面創建一個新的文件夾,然后這個文件夾下就會自動出現很多的內容,如果你在 Linux 上安裝了 Docker,你就會發現所有子系統的目錄下都有一個名為 docker 的文件夾</p> <p>在啟動容器時,Docker 會為這個容器創建一個與容器標識符相同的 CGroup,每一個 CGroup 下面都有一個 tasks 文件,其中存儲著屬于當前控制組的所有進程的 pid,作為負責 cpu 的子系統,如果系統管理員想要控制 Docker 某個容器的資源使用率就可以在 docker 這個父控制組下面找到對應的子控制組并且改變它們對應文件的內容,當然我們也可以直接在程序運行時就使用參數,讓 Docker 進程去改變相應文件中的內容</p> <p>當我們使用 Docker 關閉掉正在運行的容器時,Docker 的子控制組對應的文件夾也會被 Docker 進程移除,Docker 在使用 CGroup 時其實也只是做了一些創建文件夾改變文件內容的文件操作,不過 CGroup 的使用也確實解決了我們限制子容器資源占用的問題,系統管理員能夠為多個容器合理的分配資源并且不會出現多個容器互相搶占資源的問題</p> <h1>存儲驅動#</h1> <p>Docker 使用了一系列不同的存儲驅動管理鏡像內的文件系統并運行容器,這些存儲驅動與 Docker 卷(volume)有些不同,存儲引擎管理著能夠在多個容器之間共享的存儲。</p> <p>想要理解 Docker 使用的存儲驅動,我們首先需要理解 Docker 是如何構建并且存儲鏡像的,也需要明白 Docker 的鏡像是如何被每一個容器所使用的;Docker 中的每一個鏡像都是由一系列只讀的層組成的,Dockerfile 中的每一個命令都會在已有的只讀層上創建一個新的層</p> <p>當鏡像被 docker run 命令創建時就會在鏡像的最上層添加一個可寫的層,也就是容器層,所有對于運行時容器的修改其實都是對這個容器讀寫層的修改。</p> <p>容器和鏡像的區別就在于,所有的鏡像都是只讀的,而每一個容器其實等于鏡像加上一個可讀寫的層,也就是同一個鏡像可以對應多個容器</p> <p><img src="https://i.loli.net/2019/04/13/5cb18c8ca1b13.png" alt=""></p> <h1>AUFS#</h1> <p>UnionFS 其實是一種為 Linux 操作系統設計的用于把多個文件系統『聯合』到同一個掛載點的文件系統服務。而 AUFS 即 Advanced UnionFS 其實就是 UnionFS 的升級版,它能夠提供更優秀的性能和效率。</p> <p>AUFS 作為聯合文件系統,它能夠將不同文件夾中的層聯合(Union)到了同一個文件夾中,這些文件夾在 AUFS 中稱作分支,整個『聯合』的過程被稱為聯合掛載(Union Mount):</p> <p>每一個鏡像層或者容器層都是 /var/lib/docker/ 目錄下的一個子文件夾;在 Docker 中,所有鏡像層和容器層的內容都存儲在 /var/lib/docker/aufs/diff/ 目錄中</p> <p>而 /var/lib/docker/aufs/layers/ 中存儲著鏡像層的元數據,每一個文件都保存著鏡像層的元數據,最后的 /var/lib/docker/aufs/mnt/ 包含鏡像或者容器層的掛載點,最終會被 Docker 通過聯合的方式進行組裝</p> <p><img src="https://i.loli.net/2019/04/13/5cb18d4472cdf.png" alt=""></p> <p>這張圖片非常好的展示了組裝的過程,每一個鏡像層都是建立在另一個鏡像層之上的,同時所有的鏡像層都是只讀的,只有每個容器最頂層的容器層才可以被用戶直接讀寫,所有的容器都建立在一些底層服務(Kernel)上,包括命名空間、控制組、rootfs 等等,這種容器的組裝方式提供了非常大的靈活性,只讀的鏡像層通過共享也能夠減少磁盤的占用</p> <p>除了 AUFS 之外,Docker 還支持了不同的存儲驅動,包括 aufs、devicemapper、overlay2、zfs 和 vfs 等等,在最新的 Docker 中,overlay2 取代了 aufs 成為了推薦的存儲驅動,但是在沒有 overlay2 驅動的機器上仍然會使用 aufs 作為 Docker 的默認驅動</p> <p><img src="https://i.loli.net/2019/04/13/5cb18d9ac861a.png" alt=""></p> <p>不同的存儲驅動在存儲鏡像和容器文件時也有著完全不同的實現</p> <p>查看當前系統的 Docker 上使用了哪種存儲驅動</p> <pre class="hljs"><code>[root@192 ~]# docker info | grep Storage Storage Driver: overlay2 </code></pre> <p>本文來自<a href="https://draveness.me/docker" target="_blank">此處</a></p> </div>isle24Tue, 29 Oct 2019 17:50:36 GMTPython 系列教程之生成五星紅旗https://www.www.wsns.net.cn/topics/124https://www.www.wsns.net.cn/topics/124<div class="markdown-text"><h2>Python基礎畫個五星紅旗</h2> <pre class="hljs"><code><span class="hljs-comment"># -*- coding: utf-8 -*-</span> from turtle import * <span class="hljs-comment"># 移動點</span> def move(x, y): up() goto(x, y) down() <span class="hljs-comment"># 畫大星星</span> def draw_big(size, x, y): move(x, y) begin_fill() <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(5): forward(size) right(144) end_fill() <span class="hljs-comment"># 畫小星星</span> def draw_small(size, x, y): move(x, y) begin_fill() <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(5): forward(size) left(144) end_fill() bgcolor(<span class="hljs-string">"red"</span>) color(<span class="hljs-string">"yellow"</span>) fillcolor(<span class="hljs-string">"yellow"</span>) draw_big(100, -280, 170) draw_small(40, -130, 240) draw_small(40, -100, 180) draw_small(40, -100, 120) draw_small(40, -130, 60) <span class="hljs-keyword">done</span>() </code></pre> <p><img src="/oss/images/topics/2019/10/fa6c0ad2e14785b8021c026a0427eae4.png!large" alt=""></p> </div>maoshibaMon, 28 Oct 2019 01:00:38 GMT基于 Vue+uniApp 聊天實戰|uni-app 仿微信https://www.www.wsns.net.cn/topics/123https://www.www.wsns.net.cn/topics/123<div class="markdown-text"><blockquote> <p>使用uni-app+vue+vuex+uniPop+swiper等技術開發的仿微信聊天室uniChatRoom項目,已經基本實現了發送圖文消息、表情(gif動圖),圖片預覽、地圖位置、紅包、仿微信朋友圈等功能<br> <a href="https://www.cnblogs.com/xiaoyan2017/p/11645467.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/11645467.html</a></p> </blockquote> <h2>預覽圖</h2> <p>在h5、小程序、App端效果一致,親測有效。 <img src="/oss/images/topics/2019/10/aaa98325bc00f7bdce5a2367bcdde0ae.png!large" alt=""></p> <h2>技術實現</h2> <ul> <li>編輯器:HBuilder X</li> <li>技術框架:uni-app + vue</li> <li>狀態管理:Vuex</li> <li>iconfont圖標:阿里字體圖標庫</li> <li>自定義導航欄 + 底部Tabbar</li> <li>彈窗組件:uniPop(基于uni-app封裝模態彈窗)</li> <li>測試環境:H5端 + 小程序 + App端(三端均兼容)</li> </ul> <p><img src="/oss/images/topics/2019/10/77dc8e8ca1d80217e8429d2b37297385.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/2e6761bf0f7cb86963352d8eb5e338e0.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/d975568d22cd1e64905ef894dca887c6.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/167a98aff8121a3062d07eeb92ec9676.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/052053261f62cadb70bdd65ee5d11932.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/2e8b3779a514a9cd90c18b5223b62673.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/b4113d02069dd287e8d3b0d5cb3b04df.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/7df4ca5b94666dad5b771c4218b111ce.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/35a0d09ad62c8e9c99aea285a6e78108.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/3d6e33ffc65b9e2146656dec64e9b5b0.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/ae28707c6cce8fb0f3d29577a0e94881.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/ca733ab80e574dfaf4295fec6782dd28.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/703469c7369f09bf133a189bbf0bc460.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/75cc2d82c095475c4af7086d572d5a0a.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/bccffde8eeca8f66d94c4d404a287fc1.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/990bafd5daf4403d1ff8a2e486a9df78.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/5c9e79e00023e1327a9c58f9c3166e9c.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/63d7ecaba97f598e15cbaf1f9202338f.png!large" alt=""></p> <pre class="hljs"><code>import Vue from 'vue' import App from './App' // &gt;&gt;&gt;引入css import './assets/fonts/iconfont.css' import './assets/css/reset.css' import './assets/css/layout.css' // &gt;&gt;&gt;引入狀態管理 import store from './store' Vue.prototype.$store = store // &gt;&gt;&gt;引入公共組件 import headerBar from './components/header/header.vue' import tabBar from './components/tabbar/tabbar.vue' import popupWindow from './components/popupWindow.vue' Vue.component('header-bar', headerBar) Vue.component('tab-bar', tabBar) Vue.component('popup-window', popupWindow) // &gt;&gt;&gt;引入uniPop彈窗組件 import uniPop from './components/uniPop/uniPop.vue' Vue.component('uni-pop', uniPop) Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ ...App }) app.$mount() </code></pre> <h2>基于uni-app實現的彈窗組件UniPop</h2> <p>由于項目中很多地方需要用到彈窗,android原生彈窗又不能很好的支持自定義樣式,如是就自己開發了個uniPop模態框組件。 <a href="https://www.cnblogs.com/xiaoyan2017/p/11589149.html" target="_blank">uni-app自定義Modal彈窗組件|仿ios、微信彈窗效果</a></p> <p><img src="/oss/images/topics/2019/10/39d67b6fc8a2bfc16f76b270b96bfadf.png!large" alt=""></p> <p>在uni-app中如何實現微信朋友圈沉浸式頂部功能呢?類似 頁面向下滾動,頂部導航又透明變背景色??赏ㄟ^uniapp提供的onPageScroll函數來實現透明控制。 <img src="/oss/images/topics/2019/10/8eb5019312356628f3454cf3b3462f9d.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/10/8b3426b4d814c58f86e4c76812351809.png!large" alt=""></p> <pre class="hljs"><code>&lt;template&gt; &lt;view class=&quot;flexbox flex_col&quot;&gt; &lt;header-bar :isBack=&quot;true&quot; title=&quot;朋友圈&quot; :bgColor=&quot;{background: headerBarBackground}&quot; transparent&gt; &lt;text slot=&quot;back&quot; class=&quot;uni_btnIco iconfont icon-arrL&quot;&gt;&lt;/text&gt; &lt;text slot=&quot;iconfont&quot; class=&quot;uni_btnIco iconfont icon-publish mr_5&quot; @tap=&quot;handlePublish&quot;&gt;&lt;/text&gt; &lt;/header-bar&gt; &lt;view class=&quot;uni__scrollview flex1&quot;&gt; &lt;view class=&quot;uni-friendZone&quot;&gt; ... &lt;/view&gt; &lt;/view&gt; &lt;/view&gt; &lt;/template&gt; &lt;script&gt; export default { data() { return { headerBarBackground: 'transparent' } }, onPageScroll : function(e) { // console.log(&quot;滾動距離為:&quot; + e.scrollTop); this.headerBarBackground = 'rgba(65,168,99,'+e.scrollTop / 200+')' }, methods: { ... } } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt; </code></pre> <pre class="hljs"><code>export default { data() { return { scrollTop: 0, ... } }, mounted() { this.scrollToBottom() }, updated() { this.scrollToBottom() }, methods: { // 滾動至聊天底部 scrollToBottom(t) { let that = this let query = uni.createSelectorQuery() query.select('#scrollview').boundingClientRect() query.select('#msglistview').boundingClientRect() query.exec((res) =&gt; { // console.log(res) if(res[1].height &gt; res[0].height){ that.scrollTop = res[1].height - res[0].height } }) }, ... } } </code></pre> <p>好了,以上就是今天的介紹,后續會繼續為大家分享項目實戰案例。</p> <p>最后為大家分享最近使用vue和angular開發的聊天項目</p> <p><a href="https://www.cnblogs.com/xiaoyan2017/p/11194828.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/11194828.html</a></p> <p><a href="https://www.cnblogs.com/xiaoyan2017/p/10793728.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/10793728.html</a> <img src="/oss/images/topics/2019/10/d782282e7f76d743a63ae88e163aa9a3.jpg!large" alt=""></p> </div>xiaoyan2015Sat, 12 Oct 2019 18:23:03 GMTReact Hooks 小解https://www.www.wsns.net.cn/topics/122https://www.www.wsns.net.cn/topics/122<div class="markdown-text"><h3>前言</h3> <hr> <p>最近看很多童鞋咨詢hooks的情況,小編就寫一篇介紹下吧,本文是小編對一些鉤子的解釋和理解,具體的大家可以去看文檔。</p> <h3>hooks的優劣</h3> <hr> <p>其實文檔上都有,小編也只是挑重要的說下,<strong>hooks更加契合react的思想,使函數組件有了props和state,部分替代了class組件,畢竟少編譯一次。劣勢是還不能完全替代class組件,目前階段還缺少部分api。</strong></p> <h3>hooks和redux等第三方庫的關系</h3> <p>***‘ hooks只是能替代一部分第三方庫的功能,可以合用,不能完全替代,因為類似redux第三方庫的作用就是存數據,已經暴露一些鉤子操作數據。hooks也有類似功能,useContext可以跨級傳遞值,useReducer可以返回state和dispatch,兩者配合,可以實現在組件最頂層存儲相關數據。大家看到這里,是不是想起了以前一個很火的替代redux的方案,react中的Context屬性,傳遞操作函數和值給子組件,達到替代redux的效果。useContext和useReducer結合起來也差不多能達到類似相果,具體如何用,大家看文檔。</p> <h3>重點說說需要解釋的api</h3> <hr> <p>有些api很簡單,大家只要知道生命周期,就好了,有些就很難,小編這里挑兩個解釋,剩下的大家看文檔。</p> <ul> <li>useCallback</li> <li>useRef</li> </ul> <h3>useCallback</h3> <hr> <p>具體大家去看文檔,小編只說下自己的理解,useCallback可以是任何函數的回調,它的作用是當依賴不變時,只返回一個渲染一次的函數,節省性能,具有大家看看文檔就懂了。這個函數的好處為某些特定情形下,react依賴的props和state提供了逃生通道。</p> <h3>useRef</h3> <hr> <p>這個api作用有兩個,第一個是返回關聯的react組件對象,第二個作用是它的.current 可以獲得關聯react組件對象的state,props,方法,也就是文檔所說的一個current屬性可變且可以容納任一值的class實例。 額外解釋下文檔中的代碼</p> <pre class="hljs"><code>const intervalRef = useRef(); useEffect(() =&gt; { const id = setInterval(() =&gt; { // ... }); intervalRef.current = id; return () =&gt; { clearInterval(intervalRef.current); }; }); </code></pre> <p>intervalRef中的current可變,印證了文檔的內容,我們可以在外面獲取current的值,進行下一步操作。 我們也可可以修改current內容,把intervalRef.current 的值改成數組,對象,然后按照數組對象的取值方式取值,我們也可以把intervalRef 直接給某個子組件,來獲得子組件中的state的值,實現父子通訊,具體看下面代碼。</p> <pre class="hljs"><code>const intervalRef = useRef(); const getCurrent = () =&gt; { const { current } = intervalRef const { state: { } } = current // do something } ... ... &lt;Button onClick={e=&gt;getCurrent()}&gt;&lt;/Button&gt; &lt;Child ref={intervalRef } /&gt; </code></pre> <h3>后記</h3> <hr> <p>react hooks更加輕便好用,但是因為是新的api,所以會有一些不足,大家使用的時候,要注意取舍。</p> </div>shangjinWed, 09 Oct 2019 01:57:29 GMTH5 游戲心得指導https://www.www.wsns.net.cn/topics/119https://www.www.wsns.net.cn/topics/119<div class="markdown-text"><h3>前言</h3> <hr> <p>看著網上鋪天蓋地而來的h5小游戲,小編也提起了一些興趣,但是小編找源碼,發現都需要付費,于是小編自己潛心研究,終于理清楚了大概的思路,大家思考下面2個問題。</p> <ul> <li> <p>h5游戲和傳統的js游戲區別</p> </li> <li> <p>h5游戲如何寫更加好完美,代碼更加健壯,用戶體驗更加好</p> </li> </ul> <h3>h5游戲和傳統的js游戲區別</h3> <hr> <p>傳統的js游戲是用js操作一堆dom的增加和減少,舉個例子,假如我們需要寫個消消樂的游戲,傳統的js先會來個大的div,div中來個消消樂的背景啥的,再劃分8*8的的小格子,第一個小格子叫A11,一行二列叫A12,以此類推,直到A88。然后在每個小格子上再放個div,來當作消消樂和用戶交互的元素,再在這些元素繪制成不同的顏色,比如A11是紅色,A12是綠色等等。接著給A11-A88每個元素綁定事件,主要判斷用戶手指的方向,比如用戶把 A12向下,那么A12就按照制定的規則觸發事件。比如我們制定了一套規則,相同顏色的元素如果在同行和同列超過3個以上,就消失掉,同時增加用戶分數。每次用戶點擊元素只能滑動一格。接下來我們只需要把這些規則實現即可,如何實現這里稍微說下。核心就是for循環,沒有啥是不能for循環解決的,如果有,再套一層for。for判斷是有同行元素或者同列元素連續超過3個,如果有,消除滿足條件的元素,同時更新用戶分數,然后再隨機生成不同顏色的元素(這些元素應當不同于這個位置上下左右已有元素的顏色),填補到空位,周而復始,直到用戶達成條件,進入下一輪。</p> <p>h5游戲的基于canvas的,市面上出現的其他游戲引擎不在討論范圍內,本文討論最簡單的就好。還是以消消樂為例子,canvas分成8*8的區域,每個區域放入帶圖片的實例渲染一次,出現主界面,每個實例有用戶操作的事件,已經公共的事件,用戶操作的事件來判斷用戶把某個元素滑向哪個方向,公共事件用來判斷是不是滿足消除當前元素,增加用戶分數,重新渲染canvas等等。</p> <p>看了上面的2個分析,h5游戲的優勢是只要封裝好對象,實例化后都可以在canvas上操作,而傳統的js學習成本更低,只要無腦for即可。</p> <h3>h5游戲如何寫更加好完美,代碼更加健壯,用戶體驗更加好</h3> <hr> <ul> <li>使用requestAnimationFrame</li> </ul> <p>requestAnimationFrame按照瀏覽器cpu渲染,能最大限度的讓用戶感到流暢,我們只需要把要執行方法放入回調,完美的給了用戶視覺展示。</p> <ul> <li>多封裝構造函數</li> </ul> <p>把相同的邏輯封裝到相同的對象中,這樣使用的時候new出來即可,這個大家可以去看看設計模式。</p> <ul> <li>公共的部分抽離</li> </ul> <p>和上面一樣,都是為了增加代碼的復用性。</p> <ul> <li>理順相關邏輯,讓代碼最簡潔 寫小游戲主要是邏輯理順,用最簡單的邏輯,實現最復雜的功能!</li> </ul> <h3>后記</h3> <hr> <p>任何事都是知難行易,去努力實踐,你會發現新的世界</p> </div>shangjinThu, 26 Sep 2019 00:14:19 GMTJavaScript 之 Event Loophttps://www.www.wsns.net.cn/topics/96https://www.www.wsns.net.cn/topics/96<div class="markdown-text"><h3>前言</h3> <hr> <p>大家都知道瀏覽器是單線程的,因為這個特性,我們必須了解瀏覽器事件執行機制,也就是event loop,以便寫出高效能的代碼!在開始正題前,我們必須先理解下幾個概念。</p> <ul> <li> <p>同步任務和異步任務</p> </li> <li> <p>堆和棧</p> </li> <li> <p>宏任務和微任務</p> </li> </ul> <h3>同步任務和異步任務</h3> <hr> <p>個人的理解,同步任務是主線程需要執行的,也就是瀏覽器按照順序執行的任務。異步任務則是保存在瀏覽器棧中的任務,需要某個時間段的主任務執行完畢,才會執行的任務。</p> <h3>堆和棧</h3> <hr> <p>程序的運行過程中產生了堆和棧,具體區別大家可以google,這里簡單說下。在個人理解上,這2個都是內存,不同點是棧是系統自動分配釋放,堆是程序員分配釋放,也就是程序員能不能占有主導權。本文我們用到的是堆這個概念。</p> <h3>宏任務和微任務</h3> <hr> <p>這個網上版本很多,小編先來介紹,再來說說區別。通常來說,宏任務就是主線任務,主要執行的任務,微任務是基于每個宏任務,比如現在有3個宏任務,分別是A,B,C,和一個基于B任務的微任務D,那么瀏覽器的執行順序是A,B,D,C,這個很好理解。我們看看微任務,主要有process.nextTick,MutationObserver,Promise.then catch finally,先把定時器擱置,下面買討論。除了微任務的其余任務都是宏任務。</p> <h3>定時器是屬于宏任務還是微任務</h3> <hr> <p>我們知道微任務是必須基于宏任務的,如果是單獨按照掛起來說,那也是不正確的,因為宏任務也可能掛起!現在網上主流的理解是定時器屬于宏任務,另外一種理解是屬于微任務!說定時器是宏任務是因為按照定義,微任務必須基于宏任務,上述的Promise.then catch finally基于Promise,其余的微任務也一樣。但是說定時器是微任務是因為定時器明顯是延遲執行,符合微任務的特點。下面大家看段代碼:</p> <pre class="hljs"><code>setTimeout(() =&gt; console.log(4)) new Promise(resolve =&gt; { console.log(1) resolve() }).then(()=&gt; { console.log(3) }) console.log(2) </code></pre> <p>上述代碼返回 1,2,3,4,原因很簡單,我們現在分別用定時器是宏任務和微任務來解釋。當定時器是宏任務時,瀏覽器事件執行下來,把定時器的回調推入宏任務棧,之后直接執行promise,因為不需要等待,輸出1,之后因為Promise.then屬于微任務,再次推入微任務的棧,之后繼續執行主線程,輸出2。之后我們知道微任務有優先執行權,所以執行promise.then,輸出3,再執行掛起的定時器,輸出4。 大家看到這里是不是有疑問,既然微任務是基于宏任務的,為啥new Promise這個宏任務執行完畢,不立刻執行依賴它的then這個微任務獲得3,原因是我們把代碼從頭到位看成一個主線程,也就是必須要主線程跑完,才能執行微任務,這個時候微任務才有優先權。簡單理解就是主線程是同步的,微任務是異步的,同步的跑完,才會走異步的。定時器的回調函數也是異步的,且定時器屬于宏任務,所以在promise.then之后執行。 現在按照定時器是微任務的理論解釋,其他的一樣,定時器可以理解是屬于主線程上的微任務,主線程執行完畢,主線程可以看成是父元素,里面的各個宏任務可以看成是子元素,子元素的微任務比父元素的微任務優先度高,所以最后才執行定時器。 大家覺得能接受哪種方式,就按照哪種方式理解,反正不影響結果。按照少數服從多數的原則,本文就按照定時器是宏任務來理解。</p> <h3>event Loop 的定義</h3> <hr> <p>前方高能,請注意: <strong>事件循環過程簡單介紹:首先有2個任務隊列,宏任務隊列和微任務隊列,js會先從宏任務隊列執行任務,如果宏任務隊列為空,直接查看是否有對應的微任務,如果有微任務,循環執行微任務隊列,然后判斷是否渲染,如果沒有微任務,直接判斷是否渲染。如果宏任務隊列不為空,先執行最前面的一個宏任務,然后按照上面的過程查看微任務隊列是否為空,如果微任務存在,循環執行微任務,然后判斷是否渲染,如果微任務隊列為空,直接判斷是否渲染。</strong></p> <p>如果小伙伴們覺得文字解說不清楚的,看下面的圖片,因為網上的工具都要收費,所以小編只好截圖截兩次,大家合起來看就好</p> <p><img src="/oss/images/topics/2019/9/596e98f10723c74c739e8c25cdaa48f3.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/c7cef1217657fb3824d1f09d7b1039b4.png!large" alt=""></p> <h3>通過代碼徹底理解event Loop</h3> <hr> <pre class="hljs"><code>setTimeout(() =&gt; console.log(4)) new Promise(resolve =&gt; { console.log(1) resolve() }).then(()=&gt; { console.log(3) }) console.log(2) </code></pre> <p>還是這段代碼,參照上面的event Loop理論,首先解析整個html屬于宏任務,所以打印出1,2,然后在解析html過程中,增加了微任務promise.then(),和宏任務定時器,當解析html這個宏任務執行完畢,我們開始循環執行已經掛起的微任務,所以打印出來了3,然后瀏覽器判斷是否需要渲染,執行新一輪event Loop,也就是執行剛剛放入的定時器任務,于是出現了4。</p> <h3>后記</h3> <hr> <p>萬事萬物都有規則,掌握了規則,問題再難也能解決!</p> </div>shangjinFri, 20 Sep 2019 01:28:20 GMT定時器解決后端返回多數據導致頁面白屏卡頓的問題https://www.www.wsns.net.cn/topics/95https://www.www.wsns.net.cn/topics/95<div class="markdown-text"><h3>問題由來</h3> <p>我們在開發過程中會遇到一種情況,當后端返回大量數據時,頁面會產生白屏,這是因為瀏覽器渲染不及時,造成了頁面的卡頓,客戶在使用過程中,因為頁面長時間沒有變化,會失去耐心,進而導致大規模的客戶流失。于是,我們就想到要是有種辦法能及時更新頁面就好了。</p> <h3>宏任務和微任務</h3> <p>要解決上面這個問題,我們先來了解宏任務和微任務。這里簡單說下,要了解詳情,大家可以google下!宏任務是指js主流的任務,不是掛起的任務,比如鼠標點擊事件,鍵盤事件等,微任務就是掛起的任務,比如定時器,Promise.resolve().then()等!這里有兩點要注意的地方:</p> <p>1.<strong>同一執行周期中,微任務的優先級更高</strong></p> <p>2.<strong>宏任務和相應的微任務執行完畢,瀏覽器就會進行一次渲染</strong></p> <h3>宏任務和微任務執行以及瀏覽器渲染</h3> <pre class="hljs"><code>B = setTimeout(<span class="hljs-function"><span class="hljs-params">()</span>=&gt;</span>{ <span class="hljs-comment">/** 執行完畢需要8ms **/</span> }, <span class="hljs-number">10</span>) C = setInterval(<span class="hljs-function"><span class="hljs-params">()</span>=&gt;</span>{ <span class="hljs-comment">/** 執行完畢需要4ms **/</span> }, <span class="hljs-number">10</span>) <span class="hljs-comment">/**js 主線程 執行需要16ms**/</span> <span class="hljs-comment">/**鼠標事件A,由用戶觸發,執行完畢需要8ms**/</span> </code></pre> <p>接下來我們來看過程:</p> <p>1.<strong>假設用戶在6ms的時候點擊了按鈕,觸發了事件A,因為js的執行是單線程的,下面重點來了。</strong></p> <p>2.<strong>前16ms執行主線程,以及掛起的3個任務,A任務,B任務和C任務,因為js的單線程屬性,所以每次只能執行一項任務,當我們前16ms結束后,瀏覽器進行一次渲染,同時執行A任務,注意,不是說任務觸發了就會執行。</strong></p> <p>3.<strong>A任務執行后,也就是8ms后,第24ms,執行下一個任務B,因為B先掛起,所以比C先執行</strong></p> <p>4.<strong>第32msB任務執行完畢,執行C任務,4ms后C任務執行完畢,瀏覽器再次渲染,等待4ms,繼續執行新掛起的C任務</strong></p> <p>看到這里,大家是不是會有個疑問,周期性定時器每隔10ms觸發一次,為何前32ms只觸發了一次,原因如下:</p> <p><strong>周期性定時器處于掛起狀態時,只會掛起一次,也就是只要待執行任務隊列中存在C,那么就不會掛起新的同一定時器,如果C已經在執行了,那么待執行任務隊列是可以掛起新的將要執行的定時器C,等待執行!簡單來說,就是待執行隊列中永遠只有1個同一名稱的定時器任務。</strong></p> <h3>解決白屏的理論和實踐</h3> <p>看了上面的,聰明的你應該想到如何解決問題了吧!沒錯,就是利用微任務的執行優先權,我們把需要渲染的數據,假設10萬條,放入一個周期性定時器C,假設20ms執行一次,一次渲染100條,那么用戶沒有觸發事件的時候,我們渲染后端返回的數據,用戶點擊事件觸發后,事件自動掛起,于是當上一輪定時執行完畢,就會執行用戶的事件,從而瀏覽器進行渲染,完成和用戶的一次交互,增加了用戶體驗!用戶事件執行完畢,再度執行定時器!就是這么簡單,理論上明白了,實踐起來就容易多了!</p> <h3>后記</h3> <p>使用定時器分解任務,總的渲染時間并未減少,只是增加了用戶體驗,所以說程序的本質就是欺騙客戶!laughing~</p> </div>shangjinTue, 17 Sep 2019 02:55:43 GMTReact Native 原生 APP 聊天項目實戰|RN 仿微信聊天界面https://www.www.wsns.net.cn/topics/94https://www.www.wsns.net.cn/topics/94<div class="markdown-text"><blockquote> <p>基于 react-native+react-navigation+react-redux+react-native-image-picker+rnPop 等技術實現高仿微信聊天 APP 界面,從搭建到開發完 前前后后發了兩周左右吧,實現了消息發送、textInput文本框插入表情符、表情大圖gif、圖片選擇預覽、紅包、朋友圈等功能。 <a href="https://www.cnblogs.com/xiaoyan2017/p/11441285.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/11441285.html</a></p> </blockquote> <h2>使用技術:</h2> <ul> <li>MVVM 框架:react / react-native / react-native-cli</li> <li>狀態管理:react-redux</li> <li>頁面導航:react-navigation</li> <li>rn 彈窗組件:rnPop</li> <li>打包工具:webpack 2.0</li> <li>輪播組件:react-native-swiper</li> <li>圖片相冊:react-native-image-picker</li> </ul> <h2>效果預覽:</h2> <p><img src="/oss/images/topics/2019/9/3541a8ea43311563cfb7916d580ce919.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/f9a8f99f08b233bb9a98484128d5da1f.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/8cc235d8e273b8e0c865e715836f419c.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/89dd56d063a7c426d21a809688ae2460.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/87bbe5095f20ec593bacde6a8825d6ff.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/a84b7cc02c7ed4c9d95feb48a0cf2f38.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/6a962bebfec114bf844fb52757d6dd88.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/cc2144f769ae3bd7711ebe8cf4645070.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/c11f58ba20a4e5138299949d7148a622.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/3301226d77d00c51c42e153aa5949aa6.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/a565f15a1ff7840cb808a634d3af0a0b.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/e512b7102ed85398625ec444482d4a8f.png!large" alt=""></p> <p><img src="/oss/images/topics/2019/9/2bda6f32cc10db50d9d861089ace2bd8.png!large" alt=""></p> <pre class="hljs"><code>{ &quot;name&quot;: &quot;RN_ChatRoom&quot;, &quot;aboutMe&quot;: &quot;QQ:282310962、wx:xy190310&quot;, &quot;dependencies&quot;: { &quot;react&quot;: &quot;16.8.6&quot;, &quot;react-native&quot;: &quot;0.60.4&quot; }, &quot;devDependencies&quot;: { &quot;@babel/core&quot;: &quot;^7.5.5&quot;, &quot;@babel/runtime&quot;: &quot;^7.5.5&quot;, &quot;@react-native-community/async-storage&quot;: &quot;^1.6.1&quot;, &quot;@react-native-community/eslint-config&quot;: &quot;^0.0.5&quot;, &quot;babel-jest&quot;: &quot;^24.8.0&quot;, &quot;eslint&quot;: &quot;^6.1.0&quot;, &quot;jest&quot;: &quot;^24.8.0&quot;, &quot;metro-react-native-babel-preset&quot;: &quot;^0.55.0&quot;, &quot;react-native-gesture-handler&quot;: &quot;^1.3.0&quot;, &quot;react-native-image-picker&quot;: &quot;^1.0.2&quot;, &quot;react-native-swiper&quot;: &quot;^1.5.14&quot;, &quot;react-navigation&quot;: &quot;^3.11.1&quot;, &quot;react-redux&quot;: &quot;^7.1.0&quot;, &quot;react-test-renderer&quot;: &quot;16.8.6&quot;, &quot;redux&quot;: &quot;^4.0.4&quot;, &quot;redux-thunk&quot;: &quot;^2.3.0&quot; } } </code></pre> <h2>react-native 實現全屏幕啟動頁,可自定義背景圖</h2> <p>reactNative 全屏啟動頁制作(隱藏狀態欄,實現沉浸式) 只需把 StatusBar 設置為透明即可,這樣狀態欄和背景頁面一體了。 <code>&lt;statusbar backgroundcolor=&quot;transparent&quot; barstyle=&quot;light-content&quot; translucent=&quot;{true}&quot;&gt;&lt;/statusbar&gt;</code></p> <pre class="hljs"><code>/** * @desc 啟動頁面 */ import React, { Component } from 'react' import { StatusBar, Animated, View, Text, Image } from 'react-native' export default class Splash extends Component{ constructor(props){ super(props) this.state = { animFadeIn: new Animated.Value(0), animFadeOut: new Animated.Value(1), } } render(){ return ( &lt;Animated.View style={[GStyle.flex1DC_a_j, {backgroundColor: '#1a4065', opacity: this.state.animFadeOut}]}&gt; &lt;StatusBar backgroundColor='transparent' barStyle='light-content' translucent={true} /&gt; &lt;View style={GStyle.flex1_a_j}&gt; &lt;Image source={require('../assets/img/ic_default.jpg')} style={{borderRadius: 100, width: 100, height: 100}} /&gt; &lt;/View&gt; &lt;View style={[GStyle.align_c, {paddingVertical: 20}]}&gt; &lt;Text style={{color: '#dbdbdb', fontSize: 12, textAlign: 'center',}}&gt;RN-ChatRoom v1.0.0&lt;/Text&gt; &lt;/View&gt; &lt;/Animated.View&gt; ) } componentDidMount(){ // 判斷是否登錄 storage.get('hasLogin', (err, object) =&gt; { setTimeout(() =&gt; { Animated.timing( this.state.animFadeOut, {duration: 300, toValue: 0} ).start(()=&gt;{ // 跳轉頁面 util.navigationReset(this.props.navigation, (!err &amp;&amp; object &amp;&amp; object.hasLogin) ? 'Index' : 'Login') }) }, 1500); }) } } </code></pre> <h2>react-navigation 導航器實現自定義頂部導航條 headerBar 組件</h2> <p><img src="/oss/images/topics/2019/9/40c9fb703c4cd0225e5fb43df8a97503.png!large" alt=""></p> <h2>reactNative 自定義 modal 彈窗|dialog 對話框</h2> <p>由于 RN 提供的彈窗有時不能滿足項目需求,這時就需要自己重新定制彈窗,不過依舊基于 Modal 來實現。 看看下面這個,自己開發的 rnPop 彈窗組件, 功能效果還不錯~~ 支持多種調用方式,具體的可以去看看這篇文章介紹 <a href="https://www.cnblogs.com/xiaoyan2017/p/11292096.html" target="_blank">https://www.cnblogs.com/xiaoyan2017/p/11292096.html</a> <img src="http://bbs.reactnative.cn/assets/uploads/files/1567566980689-360%E6%88%AA%E5%9B%BE20190904110732144.png" alt=""></p> <p><img src="http://bbs.reactnative.cn/assets/uploads/files/1567567034873-360%E6%88%AA%E5%9B%BE20190904111705300.png" alt=""></p> <p><img src="http://bbs.reactnative.cn/assets/uploads/files/1567568876657-360%E6%88%AA%E5%9B%BE20190904111151559.png" alt=""></p> <pre class="hljs"><code>static defaultProps = { isVisible: false, //彈窗顯示 title: '', //標題 content: '', //內容 style: null, //自定義彈窗樣式 {object} contentStyle: null, //內容樣式 skin: '', //自定義彈窗風格 icon: '', //自定義彈窗圖標 shade: true, //遮罩層 shadeClose: true, //點擊遮罩層關閉 opacity: '', //遮罩層透明度 time: 0, //彈窗自動關閉秒數 xtime: false, //顯示關閉秒數 end: null, //銷毀彈窗時回調函數 anim: 'scaleIn', //彈窗動畫( scaleIn / fadeIn / top / bottom / left / right ) follow: null, //跟隨定位(適用于在長按位置定位彈窗) position: '', //彈窗位置 btns: null, //彈窗按鈕(不設置則不顯示按鈕)[{...options}, {...options}] } </code></pre> <h2>reactNative 如何實現聊天表情、在 TextInput 插入表情</h2> <p><img src="http://bbs.reactnative.cn/assets/uploads/files/1567567997488-360%E6%88%AA%E5%9B%BE20190904113138652.png" alt=""></p> <p>在社交軟件中,基本上都會有 emoji 表情功能。聊天中要顯示文字和 emoji 表情的混排(下圖所示),在原生 iOS 開發時,可以用富文本 NSAttributedString 實現,安卓中用 SpannableString 實現。當用到 React-Native 來開發這個功能的時候,貌似沒有直接的現成的實現方案。 方法一: 通過特殊符處理,[高興] (:88 類似這樣的,處理起來比較麻煩,而且圖片多了會影響頁面性能。 具體實現方法可參考: <a href="https://www.jianshu.com/p/2331860db169" target="_blank">https://www.jianshu.com/p/2331860db169</a> 方法二: 使用 emoj 表情符,這種方式處理比較簡單,網上很多表情符可用,而且不需要特殊處理,性能也還不錯。如果要求不高,推薦這種方式。</p> <pre class="hljs"><code>faceList: [ { nodes: [ '','','','','','','', '','','','','','','', '','','','','','','del', ] }, { nodes: [ '','','','','','','', '','','','','','','', '','','','','','','del', ] }, { nodes: [ '','','','','','','', '','','','','','','', '','','?','?','?','???','del', ] }, ... ] </code></pre> <p>好了,以上就是今天的分享,希望以后能給大家分享更多知識。</p> <p>附上最近開發的項目實例,希望能喜歡 ~~~ vue網頁端聊天室:<a href="https://cloud.tencent.com/developer/article/1420150" target="_blank">https://cloud.tencent.com/developer/article/1420150</a> react聊天室IM:<a href="https://cloud.tencent.com/developer/article/1449791" target="_blank">https://cloud.tencent.com/developer/article/1449791</a> <img src="https://img-cdn-qiniu.dcloud.net.cn/uploads/article/20190902/1ec3462cb5604edd1137633a847a76ac.jpg" alt=""></p> </div>xiaoyan2015Tue, 03 Sep 2019 22:52:50 GMT前端開發者學習方式和進階https://www.www.wsns.net.cn/topics/93https://www.www.wsns.net.cn/topics/93<div class="markdown-text"><p>最近接觸了很多前端的小伙伴,和他們談了很多職業發展的問題,大部分是做了一到三年的前端新手。在交流中發現了一個很有意思的現象,同樣是入門不足三年,有部分人覺得前端很有前途,甚至有人年薪已經30W以上,但也有部分人覺得前端薪資不高,技術體系龐雜,迭代速度飛快,苦于學習各種不斷更新的技術和框架,心神俱疲。 同樣是前端工程師,技術體系是相同的,工作年限也是相近的,為什么差別這么大?我在前端領域摸爬滾打也有兩年了,如何跟上前端技術飛速更新的步伐,我認為學習方法一定要找對,抓住學習的重點才能事半功倍。我總結了幾個學習中要注意的點,和各位技術水平卡在瓶頸,苦惱于怎么提高的年輕工程師們分享。</p> <h4>第一點 夯實基礎</h4> <p>基礎一定要掌握牢固,基礎知識一問三不知,就是貽笑大方。css,js基礎知識一定要掌握得很熟練。 到什么程度可以稱為熟練?你能使用css實現斑馬條紋背景,毛玻璃效果嗎?能給圖片實現濾鏡效果,能實現所有自適應布局效果嗎?原型,原型鏈,閉包是實現設計模式的必備知識,你真的弄懂了嗎?閉包導致內存泄漏的原因是什么,你弄明白了嗎?ajax跨域的解決方案你可以說幾種?9102年了,你還是只告訴我jsonp嗎?http協議有了解過嗎? 現在是9102年了,這些問題老掉牙了??墒俏乙嬖V你的是,掌握好這些老掉牙的基礎,就是很重要。<strong>上層的技術可以變更的很快,基礎變動很慢,投入時間學好基礎,性價比很高。</strong></p> <h4>第二點 深究原理</h4> <p>Angular,React,Vue框架和腳手架的普及,越來越多的前端工程師浮于表面,調用框架的API完成任務就完事。要成為一名優秀的前端,絕不能成為單純的”API調用工程師”,一定要掌握框架背后的原理性知識。</p> <p>Virtual DOM diff算法,雙向綁定原理等等框架背后的機制都值得我們去學習。<strong>框架API可以更新很快,而他們背后的原理都是相似的,學好原理既可以讓我們對框架底層了解更深入,又可以使我們迅速掌握不斷更新的框架表層。只會用框架永遠也成不了大神。</strong></p> <h4>第三點 注意細節</h4> <p>“代碼能用就行”的認識往往是初級程序員的通病。作為有在技術道路上有理想的工程師,一定要對自己的代碼嚴格要求,精益求精。</p> <p>比如HTML一定要注意語義化以方便SEO優化,該用&lt;section&gt;,&lt;head&gt;,&lt;foot&gt;的地方不能一股腦兒用&lt;div&gt;完事;css中編寫樣式時不能頁面上樣式是有了,類名和屬性排序寫得一塌糊涂,建議大家按照BEM規范編寫風格良好的代碼;js中變量命名隨意是很常見的不規范行為,一個不直觀的變量名往往使同事看了腦袋大。</p> <p>“代碼千萬行,注釋第一行。命名不規范,同事兩行淚?!耙皇琢餍性?,飽含了多少程序員的血與淚。</p> <h4>第四點 登高見遠</h4> <p>前端經歷了這么多年的飛速發展,早已成為浩瀚的大海。如果悶著頭獨自鉆研苦學,那無疑是很慢的。</p> <p><img src="/oss/images/topics/2019/8/f9f78b5d6044d6133c1b1fbac7b90562.png!large" alt=""></p> <p>技能圖譜</p> <p>如果我們直接去跟隨大神學習,那將會使我們快速成長。github上有很多優秀的前端項目,仔細研讀這些項目的代碼,在commit記錄中查看編程思想和邏輯的進化過程,就是一場與大神直接的面對面交流,是一場絕妙的學習之旅。</p> <h4>第五點 福利分享</h4> <p>再回到開頭舉得例子,同樣的工作年限,到后來卻是不同的發展路徑,每個人的學習習慣很重要。愿意去突破自己是一回事,知道怎么才能更好的幫助自己是另一回事。推薦網易云課堂的前端進階免費直播課,由網易資深前端工程師每天晚上8點直播2小時,深度剖析JavaScript、分析實戰經驗、面試技巧。</p> <p>下面是4月8日-4月14日每天的直播主題和大綱,都是一些干貨分享并且不收費,建議想進階的同學堅持學習。掃碼添加云課堂助教微信(weizhuanye042)就可以免費聽這個直播,希望各位在技術之路上能有所收獲。</p> </div>z15026341065Thu, 29 Aug 2019 01:35:06 GMTVue-cli3.0腳手架安裝教程https://www.www.wsns.net.cn/topics/92https://www.www.wsns.net.cn/topics/92<div class="markdown-text"><p>一、安裝cli<br> <code>npm install @vue/cli -g</code><br> 二、vue-cli搭建腳本文件<br> <code>vue create kinlin</code>這里kinlin是文件名<br> 三、選擇Manually select features。<br> 四、選擇項目需要的一些特性(此處我們選擇需要Babel編譯、使用Vue路由、Vue狀態管理器、CSS預處理器、代碼檢測和格式化、以及單元測試,暫時不考慮端到端測試(E2E Testing))。<br> 五、要使用less使用選擇CSS預處理器語言,此處選擇LESS。<br> 六、選擇ESLint的代碼規范,此處使用 Standard代碼規范。<br> 七、選擇單元測試解決方案,此處選擇 Jest。<br> 八、選擇 Babel、PostCSS、ESLint等配置文件存放位置,此處選擇單獨保存在各自的配置文件中,常用配置package.json。<br> 九、配置完成后等待Vue-cli完成初始化。<br> 十、vue-cli初始化完成后,根據提示,進入到vue-test項目中,并啟動項目。 一般情況直接安裝vue3.0搭建文件配置好常用的特性就好記住配置好了都需要<code>npm install</code>安裝依賴運行, 當然3.0版本的腳手架還有很多命令比如add、help等 3.0還支持自己搭建模塊 開發環境,測試環境,線上環境記住必須是這樣寫VUE_APP_后面是類名比如<code>VUE_APP_kinlin='text'</code>。 實在不好意思其實想給各位將很仔細看上樓主我不知道怎么截圖想學的可以問我。</p> </div>maoshibaTue, 27 Aug 2019 18:24:08 GMTReact 知識點梳理https://www.www.wsns.net.cn/topics/91https://www.www.wsns.net.cn/topics/91<div class="markdown-text"><h2>react 基礎</h2> <h3>JSX</h3> <ul> <li>JSX是一個 JavaScript 的語法擴展,可以很好地描述 UI 應該呈現出它應有交互的本質形式。</li> <li>React DOM 在渲染所有輸入內容之前,默認會進行轉義。它可以確保在你的應用中,永遠不會注入那些并非自己明確編寫的內容。所有的內容在渲染之前都被轉換成了字符串。</li> <li>JSX 里的 class 變成了 className</li> </ul> <h6>深入了解:</h6> <p>JSX 僅僅只是 React.createElement(component, props, …children) 函數的語法糖。</p> <p>如下JSX代碼:</p> <pre class="hljs"><code>&lt;MyButton color=&quot;blue&quot; shadowSize={2}&gt; Click Me &lt;/MyButton&gt; </code></pre> <p>會編譯為:</p> <pre class="hljs"><code>React.createElement( MyButton, {color: 'blue', shadowSize: 2}, 'Click Me' ) </code></pre> <h3>元素</h3> <ul> <li>元素是構成 React 應用的最小磚塊。</li> <li>React 元素是創建開銷極小的普通對象。React DOM 會負責更新 DOM 來與 React 元素保持一致。</li> <li>組件是由元素構成的。</li> <li><code>false</code>, <code>null</code>, <code>undefined</code>, <code>true</code> 是合法的子元素。但它們并不會被渲染。</li> </ul> <p>以下的 JSX 表達式渲染結果相同:</p> <pre class="hljs"><code>&lt;div /&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;{false}&lt;/div&gt; &lt;div&gt;{null}&lt;/div&gt; &lt;div&gt;{undefined}&lt;/div&gt; &lt;div&gt;{true}&lt;/div&gt; </code></pre> <h3>組件</h3> <p>組件名稱必須以大寫字母開頭(React 會將以小寫字母開頭的組件視為原生 DOM 標簽)</p> <ul> <li>函數組件(以前稱之為無狀態組件,但<code>Hook</code>出來之后叫為函數組件):</li> </ul> <pre class="hljs"><code>function Welcome(props) { return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;; } </code></pre> <ul> <li>class組件</li> </ul> <pre class="hljs"><code>class Welcome extends React.Component { render() { return &lt;h1&gt;Hello, {this.props.name}&lt;/h1&gt;; } } </code></pre> <h3>props</h3> <p>當 React 元素為用戶自定義組件時,它會將 JSX 所接收的屬性(attributes)轉換為單個對象傳遞給組件,這個對象被稱之為 “props”。組件無論是使用函數聲明還是通過 class 聲明,都決不能修改自身的 props</p> <pre class="hljs"><code>// 這段代碼會在頁面上渲染 “Hello, Sara” function Welcome(props) { return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;; } const element = &lt;Welcome name=&quot;Sara&quot; /&gt;; ReactDOM.render( element, document.getElementById('root') ); //上段代碼渲染時發生了什么: 1. 我們調用 ReactDOM.render() 函數,并傳入 &lt;Welcome name=&quot;Sara&quot; /&gt; 作為參數。 2. React 調用 Welcome 組件,并將 {name: 'Sara'} 作為 props 傳入。 3. Welcome 組件將 &lt;h1&gt;Hello, Sara&lt;/h1&gt; 元素作為返回值。 4. React DOM 將 DOM 高效地更新為 &lt;h1&gt;Hello, Sara&lt;/h1&gt;。 </code></pre> <p>有多種方式可以在 JSX 中指定 props。</p> <ul> <li>JavaScript 表達式作為 Props</li> <li>字符串字面量</li> <li>props 默認值為<code>true</code></li> </ul> <h3>State</h3> <ul> <li>使用<code>this.setState()</code>設置state的值</li> <li><code>this.setState()</code>可能是異步的</li> <li>調用<code>this.setState()</code>的時候,React 會把你提供的對象合并到當前的 state。</li> </ul> <h3>數據流</h3> <p><code>react</code>是單向數據流,任何的 state 總是所屬于特定的組件,而且從該 state 派生的任何數據或 UI 只能影響樹中“低于”它們的組件。</p> <h3>生命周期</h3> <p>在 V16 版本中引入了 Fiber 機制。這個機制一定程度上的影響了部分生命周期的調用,并且也引入了新的 2 個 API 來解決問題。(Fiber 本質上是一個虛擬的堆棧幀,新的調度器會按照優先級自由調度這些幀,從而將之前的同步渲染改成了異步渲染,在不影響體驗的情況下去分段計算更新。在之前的版本中,如果你擁有一個很復雜的復合組件,然后改動了最上層組件的 state,那么調用??赡軙荛L,調用棧過長,再加上中間進行了復雜的操作,就可能導致長時間阻塞主線程,帶來不好的用戶體驗。Fiber 就是為了解決該問題而生。)</p> <pre class="hljs"><code>class ExampleComponent extends React.Component { // 用于初始化 state constructor(props) { super(props) this.state = { hasError: false }; } // 用于替換 `componentWillReceiveProps` ,該函數會在初始化和 `update` 時被調用 // 因為該函數是靜態函數,所以取不到 `this`, 如果需要對比 `prevProps` 需要單獨在 `state` 中維護 // 它應返回一個對象來更新 state static getDerivedStateFromProps(nextProps, prevState) {} // 判斷是否需要更新組件,多用于組件性能優化 shouldComponentUpdate(nextProps, nextState) {} // 組件掛載后調用 // 可以在該函數中進行請求或者訂閱 componentDidMount() {} // 用于替換 componentWillUpdate ,該函數會在 update 后 DOM 更新前被調用 // 用于讀取最新的 DOM 數據。 getSnapshotBeforeUpdate() {} // 組件即將銷毀 // 可以在此處移除訂閱,定時器等等 componentWillUnmount() {} // 組件銷毀后調用 componentDidUnMount() {} // 組件更新后調用 componentDidUpdate() {} // 錯誤邊界 - 渲染備用 UI // 更新 state 使下一次渲染能夠顯示降級后的 UI // 注意錯誤邊界僅可以捕獲其子組件的錯誤,它無法捕獲其自身的錯誤 static getDerivedStateFromError(error) { return { hasError: true }; } // 錯誤邊界 - 打印錯誤信息 // 你同樣可以將錯誤日志上報給服務器 // 注意錯誤邊界僅可以捕獲其子組件的錯誤,它無法捕獲其自身的錯誤 componentDidCatch(error, info) { console.log(error, info); } // 渲染組件函數 render() {} // 以下函數不建議使用 UNSAFE_componentWillMount() {} UNSAFE_componentWillUpdate(nextProps, nextState) {} // 接收到新的props時調用 UNSAFE_componentWillReceiveProps(nextProps) {} } </code></pre> <p>對于異步渲染,現在渲染有兩個階段:reconciliation 和 commit 。前者過程是可以打斷的,后者不能暫停,會一直更新界面直到完成。</p> <ul> <li>Reconciliation 階段: <ul> <li>componentWillMount</li> <li>componentWillReceiveProps</li> <li>shouldComponentUpdate</li> <li>componentWillUpdate</li> </ul> </li> <li>Commit 階段: <ul> <li>componentDidMount</li> <li>componentDidUpdate</li> <li>componentWillUnmount</li> </ul> </li> </ul> <p>因為 reconciliation 階段是可以被打斷的,所以 reconciliation 階段會執行的生命周期函數就可能會出現調用多次的情況,從而引起 Bug。所以對于 reconciliation 階段調用的幾個函數,除了 shouldComponentUpdate 以外,其他都應該避免去使用。</p> <h4>V16.4以后生命周期圖解(不包含官方不建議使用的)</h4> <p><img src="/oss/images/topics/2019/8/f69ef8e07767a38f9c7c0117c5e709e8.png!large" alt=""></p> <h3>事件處理</h3> <ul> <li>React 事件的命名采用小駝峰式(camelCase),而不是純小寫。</li> <li>使用 JSX 語法時你需要傳入一個函數作為事件處理函數,而不是一個字符串。</li> </ul> <p>為JSX內時間綁定this的幾種方式:</p> <ul> <li>constructor內處理:</li> </ul> <pre class="hljs"><code>constructor() { this.handleClick = this.handleClick.bind(this); } </code></pre> <ul> <li>JSX內使用bind:</li> </ul> <pre class="hljs"><code>&lt;button onClick={this.handleClick.bind(this, id)}&gt;Delete Row&lt;/button&gt; </code></pre> <ul> <li>箭頭函數:</li> </ul> <pre class="hljs"><code>&lt;button onClick={() =&gt; this.handleClick(id)}&gt;Delete Row&lt;/button&gt; </code></pre> <h3>key</h3> <p>key 幫助 React 識別哪些元素改變了,比如被添加或刪除。因此你應當給數組中的每一個元素賦予一個確定的標識。 key 只是在兄弟節點之間必須唯一</p> <h3>受控組件</h3> <p>使 React 的 state 成為“唯一數據源”。渲染表單的 React 組件還控制著用戶輸入過程中表單發生的操作。被 React 以這種方式控制取值的表單輸入元素就叫做<code>受控組件</code>。</p> <h3>非受控組件</h3> <p>表單數據將交由 DOM 節點來處理。使用非受控組件時如果想賦予組件一個初始值,但是不去控制后續的更新。 在這種情況下, 你可以指定一個 <code>defaultValue</code> 屬性,而不是 value。</p> <p><code>&lt;input type=&quot;file&quot; /&gt;</code> 始終是一個非受控組件</p> <h3>進階</h3> <p><a href="https://github.com/TigerHee/shareJS/blob/master/react/02.react-advance.md" target="_blank">redux-adcanve</a></p> <h4><a href="https://github.com/TigerHee/shareJS" target="_blank">點擊獲取更多知識點</a> 覺得有用的話,來個star鼓勵,持續更新中。</h4> </div>TigerHeeThu, 22 Aug 2019 19:47:43 GMT