前端快速開發模版

来源:http://www.cnblogs.com/edwardloveyou/archive/2017/11/28/7906475.html
-Advertisement-
Play Games

原文地址: "前端快速開發模版" 之前一直在開發移動端的單頁面應用,而移動web對性能和效果要求是比較苛刻的,所以用的都是輕量級的框架體系。基本上是Zepto加自己開發的單頁面框架,再加上若幹簡單的庫。這樣前端要載入的文件很小,修改起來也非常方便,同時這樣的輕量級的體系使用gulp進行自動化管理也是 ...


原文地址:前端快速開發模版
之前一直在開發移動端的單頁面應用,而移動web對性能和效果要求是比較苛刻的,所以用的都是輕量級的框架體系。基本上是Zepto加自己開發的單頁面框架,再加上若幹簡單的庫。這樣前端要載入的文件很小,修改起來也非常方便,同時這樣的輕量級的體系使用gulp進行自動化管理也是非常合適的。

自從開發react項目後,對它的工程化和開發模式也是開了眼界,標準的框架體系就是重量級的react+redux+webpack。開發大型項目和後臺管理系統用react,vue確實是不錯的。但是開發一些小項目,比如前端h5之類的又有殺雞用牛刀的感覺。

於是借鑒webpack工程化思想動手寫了個前端快速開發模版,用於開發快速簡潔的項目,比如之前的單頁面應用。而這個項目模版就是類似前端開發的腳手架了,基本的思路就是自動化和前端編譯,主要達到以下目的:

  1. 使用less預編譯css,使用autoprefixer進行樣式相容
  2. js代碼用babel編譯,因此可基於es6,es7編寫代碼
  3. 類庫文件使用npm包,js文件使用browserify組織和打包,不再使用sea,require之類的載入器
  4. html代碼使用swig模版引擎進行組織和預編譯
  5. 靜態資源版本使用rev管理,當css或js文件內容有變化,打包時自動更新版本
  6. 前端開發基礎樣式,框架的整合。

工具鏈

  • 構建工具gulp
  • 編譯打包工具browserify
  • 代碼編譯babel
  • css相容autoprefixer
  • css預編譯less
  • html代碼預編譯模版swig
  • 前端代碼版本更新rev

公共類庫

  • jQuery
  • Zepto
  • 自己開發的簡潔單頁面框架app.js
  • 圖標fontello
  • 字體reboto
  • 基礎樣式base.css

文件目錄結構

  • css: css文件
  • less: less文件
  • js: js文件
  • dist: 打包生成的項目文件
  • layout: html母板
  • lib: 公共類庫
  • template: html頁面

項目自動化

沒有使用重量級的webpack,而是使用輕量級的gulp和browserify

公共類庫

公共類庫的文件,主要有基礎樣式base.css,圖標樣式reboto,字體樣式fontello,單頁面框架app,直接拷貝到dist文件就ok。其他npm包跟nodejs項目一樣在node_modules中,不需要處理。

    //複製公共庫目錄下的所有內容
    gulp.task('copy',function(){
        return gulp.src('./lib/**')
            .pipe(gulp.dest('./dist/lib/'));
    });

css文件

首先將less文件轉為css,用autoprefixer添加相容性首碼,合併壓縮,放到dist目錄,最後用rev插件生成版本信息,這個後面用於替換更新鏈接用。

    //編譯css,添加相容尾碼,壓縮
    gulp.task('css', function() {
        return gulp.src('./less/*.less')
            .pipe(less())
            // .pipe(concatCss("index.css"))
            .pipe(postcss([ autoprefixer({
                    "browsers": ["last 2 version", "> 0.5%", "ie 6-8","Firefox < 20"]
                    // "browsers": ["last 2 version", "> 0.1%"]
                })
            ]))
            .pipe(cleanCSS())
            // .pipe(rename({suffix: '.min'}))
            // .pipe(gulp.dest('./dist/css'));
            .pipe(rev())
            .pipe(gulp.dest('./dist/css'))
            .pipe(rev.manifest())
            .pipe(gulp.dest('./rev/css'));

    });

js文件

我這裡有兩個入口文件,可以隨時將新入口文件添加到scripts數組中,這裡做的就是使用babel轉換代碼,然後將外部文件,npm包打包進來,生成sourcemap,輸出到dist文件夾,最後一樣用rev插件生成版本信息。

    var scripts=['app','index'];
    scripts.map(name=>{
        gulp.task(name,function(){
                return  browserify({
                    entries:'./js/'+name+'.js',  //entries file name
                    debug:true // set true so the bundle file can generate sourcemap 
                })
                .transform(babelify,{ 
                    plugins: ["transform-runtime"],
                    presets: [
                        'es2015',  //convert to es5
                        'stage-0'  //es7
                    ]
                })
                .bundle()  //merge
                .pipe(source(name+'.js'))
                .pipe(buffer())
                // .pipe(uglify())
                .pipe(sourcemaps.init({loadMaps: true})) //External sourcemap file
                .pipe(sourcemaps.write('./'))
                .pipe(rev())
                .pipe(gulp.dest('./dist/js/'))
                .pipe(rev.manifest(name+'.json'))
                .pipe(gulp.dest('./rev/js/'));
        });
    });

html文件

html編譯我使用的是模版引擎是swig,這裡用的是gulp-swig插件,當然也可以用ejs或jade的引擎。但我個人比較習慣用swig,因為它更靈活,支持各種文件格式,可以直接使用html文件,也支持ejs不支持的layout等。gulp-swig插件的使用也非常簡單。

    //swig編譯輸出html
    gulp.task('html', function() {
      return gulp.src('./template/*.html')
        .pipe(swig({
            defaults: {cache: false }
        }))
        .pipe(gulp.dest('./'))
    });

文件版本控制

之前編譯css和js的時候已經調用rev生成了記錄了版本信息的json文件,如果內容有變化它會生成新的md5文件名。這裡就是用rev-collector替換html文件中除md5部分外相同文件名的鏈接,這樣就就實現了版本更新功能,用這個插件可以更新css,js,圖片等的版本。

    //更新css和js版本,同時替換html中的鏈接標簽
    gulp.task('rev', scripts.concat(["css","html"]),function () {
        return gulp.src(['./rev/**/*.json', './*.html'])//add md5 suffix to js and css file, replace the link of html as well 
            .pipe( revCollector({
                replaceReved: true,
                dirReplacements: {
                    '/css': '/css',
                    '/js': '/js'
                }
            }))
            .pipe( gulp.dest('./dist') );
    });

html裡面替換後的鏈接格式如下

    <link rel="stylesheet" href="./css/app-d333f590b0.css">
    <script src="./js/app-62bad8e549.js"></script>

項目模版

項目自動化配置完後,接著就是配置項目模版了,這裡分兩種類型的模版:1.移動端優先的單頁面;2.pc端優先的普通頁面。
swig標簽語法

  • extends 繼承父模板,必須在文件最前
  • block 定義一個塊,使之可以被繼承的模板重寫,或者重寫父模板的同名塊
  • parent 將父模板中同名塊註入當前塊中
  • include 包含一個模板到當前位置

移動端單頁面模版

在layout文件夾新建移動端的單頁面模版app-layout.html,然後再建立子目錄partial,用於存放公共代碼塊。

我們知道載入頁面時再去載入外部文件是需要耗費載入時間,而頁面直出可以大大提高載入速度,同時預先載入部分樣式也可以避免載入時的白屏問題。這也是我們這裡將公共部分的js和css以代碼塊的形式嵌入到html文件中,達到頁面直出的效果。

swig支持將html文件嵌入,同時也可以將css文件嵌入,我這裡就是把單頁面樣式文件app.css和基礎樣式文件app-base.css的內容直接輸出到style標簽中。主要的代碼塊有:

  • meta.html: 頭部meta標簽
  • header-script.html: 主要是動態設置fontsize大小的腳本
  • footer-script.html: 主要是頁面載入過程的動畫腳本

當然了圖標樣式,好看的字體文件,單頁面的css,基礎的樣式css都有, 同時母版還挖出了幾個block給繼承的頁面進行重寫,比如block title,block css,block js,內容block content。css塊和js塊既可以寫外部鏈接也可以直接寫代碼。 我們可以根據自己的需求進行修改和配置文件,具體內容看如下代碼。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>{% block title %}{% endblock %}</title>
    {% include './partial/meta.html' %}
    <!-- 頁面內載入的頭部js -->
    {% include './partial/header-script.html' %}
    <!-- 頁面內載入的css -->
    <style>{% include '../lib/app/app.css' %}{% include '../lib/app-base.css' %}</style>
    <!-- 圖標 -->
    <link rel="stylesheet" href="./lib/fontello/fontello.css">
    <!-- 字體 -->
    <link rel="stylesheet" href="./lib/reboto/roboto.css">
    <!-- 項目css -->
    <link rel="stylesheet" href="./css/app.css">
    <!-- 外部css塊 -->
    {% block css %}{% endblock %}
    </head>
    <body>
    <div id="app" class="view-wrap"></div>
    <div id="loading" class="loading-wrap">
        <div class="loading">
            <div class="round"></div>
            <div class="txt">0%</div>
        </div>
    </div>
    <div id="freshing" class="fresh-wrap">
        <div class="loading">
            <div class="round"></div>
            <p class="txt">loading...</p>
        </div>
    </div>
    <!-- 內容填充塊 -->
    {% autoescape false %}
    {% block content %}{% endblock %}
    {% endautoescape %}
    <!-- 頁面內載入的尾部js -->
    {% include './partial/footer-script.html' %}
    <!-- 外部js塊 -->
    {% block js %}{% endblock %}
    </body>
    </html>

PC端優先模版

接著就是建立PC端優先的模版layout.html,這個和單頁面模版相似,主要區別就是基礎樣式,同時不用嵌入移動端的代碼,頁面模版請看如下代碼:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>{% block title %}{% endblock %}</title>
    {% include './partial/meta.html' %}
    <link rel="stylesheet" href="./lib/fontello/fontello.css">
    <link rel="stylesheet" href="./lib/reboto/roboto.css">
    <style>{% include '../lib/base.css' %}</style>
    <link rel="stylesheet" href="./css/index.css">
    {% block css %}{% endblock %}
    </head>
    <body>
    {% autoescape false %}
    {% block content %}{% endblock %}
    {% endautoescape %}
    {% include './partial/copyright.html' %}
    {% block js %}{% endblock %}
    </body>
    </html>

使用方式

項目模板完成了,我以建立單頁面項目為例演示使用的步驟

  1. 首先從github clone模版到文件夾webapp-project,安裝相關npm包。

        git clone https://github.com/edwardzhong/project-template.git webapp-project
    
        npm install
  2. 在less文件夾內建立app.less,並編寫代碼

        @lightBlue:hsl(198, 73%, 53%);
    
        // base
        html,body{
            font-family: "Roboto", "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;
            font-size: 0.25rem;
            color: #555;
            width: 100%;
            height: 100%;
        }
        body,p,h1,h2,h3,h4,h5,h6{margin:0;}
        ul,ol{list-type:none; margin:0; padding:0;}
        // todo more ...
    
  3. 在js文件夾建立app.js並編寫代碼, 使用es6寫代碼就是舒服

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

-Advertisement-
Play Games
更多相關文章
  • 錯誤原因是,字元串以 \ 結尾 或者字元串缺少引號。 寫代碼拼接windows 路徑出現這個錯誤, 查資料才知道 python中字元串不能以 \ 結尾 我的代碼如下 運行則報錯 那麼如何解決呢 方法一 : 使用 os.path.join 方法二:路徑的反斜杠使用轉義 而不用 r 為何 字元串不能 以 ...
  • Elasticsearch版本:6.0一、文檔一個文檔不僅包含數據,也包含元數據,三個必須的元數據如下_index:具有共同特性分到一起的文檔集合,標示了文檔的存放位置; 名字小寫,不以下劃線開頭,不包含逗號。_type:表示文檔的類型,在索引中對數據進行邏輯分區; 名字大寫或小寫,不以下劃線或句號... ...
  • 本文介紹了Kafka Stream的背景,如Kafka Stream是什麼,什麼是流式計算,以及為什麼要有Kafka Stream。接著介紹了Kafka Stream的整體架構,並行模型,狀態存儲,以及主要的兩種數據集KStream和KTable。並且分析了Kafka Stream如何解決流式系統中... ...
  • 概述 Webhook是一個API概念,並且變得越來越流行。我們能用事件描述的事物越多,webhook的作用範圍也就越大。Webhook作為一個輕量的事件處理應用,正變得越來越有用。 準確的說webhoo是一種web回調或者http的push API,是向APP或者其他應用提供實時信息的一種方式。We ...
  • 一、元數據和 (非html5) <meta http equiv="Pragma" content="no cache"> //意思是2秒後跳轉到github //指定IE和Chrome使用最新版本渲染當前頁面 //每30秒更新document //content="with=device widt ...
  • 實驗樓上很多前端教程,這裡整理7個前端開發的小游戲教程,希望對你學習前端有所幫助~ ...
  • 之前面試時候經常被問及從輸入一個網址到頁面完全展示出來都發生了什麼,支支吾吾回答沒有底氣,仔細研究了一下,發現裡面學問還真不少。這些被瀏覽器封裝起來的東西,瞭解之後才對前端的一些流行做法恍然大悟。 ...
  • 在vue的實際開發中往往會遇到公用一個組件的問題,比如有一個菜單中的兩個按鈕,點擊每個按鈕調用的是同一個組件,其內容是根據路由的參數的不同來請求不同的內容。 第一步,首先新建一個vue+webpack+vuecli的demo,如下操作: 全局安裝vue-cli,vue-cil是vue的腳手架工具,安 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...