ElfJS從入門到精通(一)

来源:https://www.cnblogs.com/burgesslee/archive/2018/01/08/8243776.html
-Advertisement-
Play Games

介紹 Elf.js 是一個簡潔的高效的 框架。它不僅高度重視用戶的體驗,也高度重視開發者的體驗。在實現當今主流技術的同時,以儘可能原生態的形式展現出來。在如今花樣繁多的框架中,你是否感覺各種思想、語法、工具大大增加了你的學習時間,那麼 是一個不錯的開始。她將最初的 Web 設計理念與現代技術完美結合 ...


介紹

Elf.js 是一個簡潔的高效的JavaScript框架。它不僅高度重視用戶的體驗,也高度重視開發者的體驗。在實現當今主流技術的同時,以儘可能原生態的形式展現出來。在如今花樣繁多的框架中,你是否感覺各種思想、語法、工具大大增加了你的學習時間,那麼Elf.js是一個不錯的開始。她將最初的 Web 設計理念與現代技術完美結合,她追求的是簡單、明朗、返璞歸真。

安裝


  • NPM

    npm install elfjs --save
  • 文件
    • NPM包的目錄你將找到.js(完整版).min.js(迷你版)以及.d.ts(類型聲明)文件。
    • elf-loader.js提供簡單的AMD/CommonJS規範的載入器,她可以讓你在開發中免去編譯的等待。
    • shims目錄下的提供在IE9上運行的補丁與集成第三方庫的補丁。她們並不是時常用到。
    • 使用支持 DefinitelyTypedIDE 可以有效的進行代碼提示與類型檢查。

開始

Elf.js並未創建過多的私有思想和語法。若你已經具有 Web 中級知識,那麼一切將非常得心應手。

第一個組件


  • Elf.js採用簡潔的模板語法來聲明 DOM 與數據。

    <!-- viewComponent.html -->
    <div>
        {{ message }}
    </div>
    // viewComponent.js
    var temp = require("viewComponent.html");
    module.exports = Elf.Component("view", {
        constructor : function () {
            this.message = "Hello Word!";
        },
        render : Elf.redactElement(temp)
    });
    // bootstrap.js
    var View = require("viewComponent");
    Elf.render(Elf.createElement(View), document.body, true);
  • 上面的代碼展示瞭如何從模板中創建組件和如何將組件渲染到指定節點。
  • 更多模板語法參見 模板語法

使用指令


  • Elf.js提供可增強HTML特性的功能。下麵將展示一個簡單的拖動功能。

    // dragDirective.js
    module.exports = Elf.Directive("drag", {
        onInitial : function (element, props) {
            Elf.attachEvent(element, "mousedown", this);
            Elf.attachEvent(element, "mousemove", this);
            Elf.attachEvent(element, "mouseup", this);
        },
        onDispose : function (element, props) {
            Elf.detachEvent(element, "mousedown", this);
            Elf.detachEvent(element, "mousemove", this);
            Elf.detachEvent(element, "mouseup", this);
        },
        handleEvent : function (event) {
            // coding drag
        }
    });
    <!-- viewComponent.html -->
    <div cmd="drag">
        {{ message }}
    </div>
    // viewComponent.js
    var temp = require("viewComponent.html");
    var dragDirective = require("dragDirective");
    module.exports = Elf.Component("view", {
        constructor : function () {
            this.message = "Hello Word!";
        },
        render : Elf.redactElement(temp, dragDirective)
    });
  • 通過Elf.Directive方法,我們定義並實現了一個拖動指令。通過Elf.redactElement函數註入依賴的指令(已經通過Elf.depend方法註冊為全局依賴則不必在這裡註入了),就可以在模板中通過指令別名使用了。此時的div已經具備拖動能力。
  • 指令能有效的將功能操作與業務邏輯分離,並高度重用代碼。

使用管道


  • 在渲染過程中,往往數據需要轉換成某種特定格式,我們可以通過Transform來實現。例如下麵代碼將日期格式化輸出。

    // dateTransform.js
    module.exports = Elf.Transform("date", {
        transform : function (value, formatExpr) {
            return moment(value).format(formatExpr);
        }
    });
    <!-- viewComponent.html -->
    <div cmd="drag">
        {{ now | date "YYYY-MM-DD" }}
    </div>
    // viewComponent.js
    var temp = require("viewComponent.html");
    var dateTransform = require("dateTransform");
    module.exports = Elf.Component("view", {
        constructor : function () {
            this.now = new Date();
        },
        render : Elf.redactElement(temp, dateTransform)
    });
  • 上面的代碼最終將日期輸出為xxxx-xx-xx格式。
  • 管道與指令一樣,都是為了將功能操作與業務邏輯分離,使得相同的功能能得以重用。

事件處理


  • Elf.js的事件綁定與原生HTML一樣。

    <!-- viewComponent.html -->
    <button onclick="onClick($event);">
        點擊試試
    </button>
    // viewComponent.js
    var temp = require("viewComponent.html");
    module.exports = Elf.Component("view", {
        render : Elf.redactElement(temp),
        onClick : function (event) {
            alert("點擊被觸發了!");
        }
    });
  • Elf.js將會自動管理事件的綁定與移除,即使在迴圈中也不必擔心作用域的問題。也不必擔心性能問題。
  • Elf.js提供了一套與原生一樣的冒泡機制,Component亦可作為觸發事件的對象。

組件通訊


  • 因為Elf.js實現的事件機制與原生相同,並且可作用與Component,所以Elf.js不需要額外的狀態管理手段。子組件的事件通過這種機制會冒泡到Individual,你只需在Individual處處理業務邏輯即可。又因為Elf.js是自動響應的,你也不需要關心數據變化後的呈現。她會自動分析新的數據與之前的數據,將更新呈現在頁面上。
  • Elf.js並不提供雙向綁定,亦不推崇單向數據流。原始的事件機制就是最好的手段,她早已深入每一個前端程式員心中。
  • 這裡我們使用一個完整的示例 elfjs-calendar
  • sldier.jscalendar.js里分別拋出了日曆操作事件,在main.js業務邏輯。

進階

正如上面的教程,Elf.js核心只提供了ComponentDirectiveTransform三個對象。模板中只提供了兩個控制流程的屬性(e-fore-if)和一個文本輸出{{ }}。但Elf.js在背後所做的遠遠不止於此。她有著高效的虛擬DOM和原生一樣的事件機制,還能自動響應數據變化。如果你想深入瞭解其原理(其實現在主流框架的原理都是相近的)。Elf.js為一個極簡的框架,將會是一個最好最優的選擇。

深入響應式原理


zone.js 啟發。數據的改變的時機無外乎用戶操作(觸發事件)和非同步函數(AjaxsetTimeout等)。Elf.js封裝了事件監聽和常用的非同步操作。使之能夠得到監控,在這些非同步操作結束後,Elf.js將會去計算數據變化,然後以最優的方式更新DOM

集成第三方類庫


由於Elf.js封裝了原生的事件,但並沒有像 zone.js 一樣侵入。所以通過Elf.js創建的DOM不再觸發用原生方法綁定的事件。因此第三方類庫的監聽可能無法觸發其綁定的事件。通過引入shims_for_Lib.js可以讓Elf.js接管WindowNode的事件監聽。從而讓第三方類庫完美運行,亦可自動響應數據變化。

使用擴展語言


Elf.js無縫支持JSXelf.d.ts中可以找到JSX定義)。但Elf.js更推薦使用模板。相較於JSX,模板有著良好的結構,視圖與邏輯分離,更好的與UI合作。同時,使用elf-loader.js載入模板,會有source map,彌補了模板調試難的短板。

生產環境部署


如同之前的開發一樣,我們使用node開發,AMDCommonJS的風格都能支持,在開發階段無需編譯、打包,並有source map輸出,擁有非常好的開發體驗。在使用打包工具(如:webpack)打包後不再輸出source map,在沒有察覺的情況下就已經提升了性能。打包過程中亦無需其它loader。當然,若想追求極致性能可以使用loader將模板預編譯為 JavaScript 。


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

-Advertisement-
Play Games
更多相關文章
  • 1,Instruments iOS自帶的自動化測試工具。 2,TuneupJs 最早的iOS自動化測試工具 https://github.com/alexvollmer/tuneup_js 3,ynm3k 在UI控制項遍歷方面有比較大的優勢 https://github.com/douban/ynm3 ...
  • 第一次寫博客,想著就從頭來吧,希望幫助到需要的人。 HTML超文本標記語言(Hyper text markup language),“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素;標記語言指語言具有可讀性,什麼是可讀性呢?比如在html裡面的table指表格、p(pragrap ...
  • 這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:“全都怪你”。 ——村上春樹《當我談跑步時我談些什麼》 本文為讀 lodash 源碼的第六篇,後續文章會更新到這個倉庫中,歡迎 star: "pocket lodash" gitbook也會同步倉庫的更新,gitbook地址: "pocket ...
  • 1. screen 1.1 availHeight/Width screen.availWidth返回瀏覽器視窗可占用的水平寬度(單位:像素)。 screen.availHeight返回瀏覽器視窗在屏幕上可占用的垂直空間,即最大高度。 1.2 availLeft/Top availTop:瀏覽器視窗 ...
  • 自己打造一把趁手的武器,高效率完成前端業務代碼。 前言 作為戰鬥在業務一線的前端,要想少加班,就要想辦法提高工作效率。這裡提一個小點,我們在業務開發過程中,經常會重覆用到日期格式化、url參數轉對象、瀏覽器類型判斷、節流函數等一類函數,這些工具類函數,基本上在每個項目都會用到,為避免不同項目多次複製 ...
  • 昨天看到這篇文章[置頂]開源組件NanUI一周年 - 使用HTML/CSS/JS來構建.Net Winform應用程式界面 就想弄一個winform結合html5的一個小東西,突有興緻,想在裡面嵌套一個微信網頁版。 好了,想法一齣來,就行動吧,最終效果如下圖: 一開始就打算在頁面裡面嵌套一個ifra ...
  • Javascript函數 Javascript函數是由事件驅動的或者當他被調用時執行的可重覆使用的代碼塊。所以說我們光創建了函數不調用是沒有啥用的,我們必須得調用它才能執行。 1.什麼是函數 (1)函數是完成某一功能的代碼段 (2)函數是可重覆執行的代碼段 (3)函數方便維護和管理 2.創建函數時我 ...
  • 這一節跑下一批plugin。 希望不要跟上一節一樣,全是plugin。 流程如圖(看看流程圖就行了,後面也沒有什麼內容): EnsureChunkConditionsPlugin 這個看看就懂,不解釋了。 RemoveParentModulesPlugin 難道又是另一批plugin麽…… Remo ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...