Gzip static file

使用node生成靜態文檔的時候, 部分項目會出現 index-a1adc171.jsindex-a1adc171.js.gz。這樣是方便支持 gzip_static 的情況直接調用 index-a1adc171.js.gz 而不用 server 再次壓縮。

例如使用 插件 vite-plugin-compression:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import compression from "vite-plugin-compression"

export default defineConfig({
  plugins: [
    react(),
    compression(),
  ],
})

要實現以上功能,還需Http Server 設定。

Nginx設定:

gzip_static  on;
gzip_proxied expired no-cache no-store private auth;

Apache設定:

# AddEncoding allows you to have certain browsers uncompress information on the fly.
AddEncoding gzip .gz

#Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

jQuery Form Plugin – jquery.form.js

jQuery Form Plugin可以很方便的提交form表單。提供了2個函數ajaxFormajaxSubmit

ajaxFormajaxSubmit參數是一樣的,兩者之間的區別是: ajaxForm不會立即提交,需要額外執行提交。ajaxForm 可以描述為對 form 的設定。ajaxSubmit則會立即提交Form

可以定義 beforeSubmit 發送ajax提交之前的操作。以及 success 提交後返回內容。

在負載的一些操作中返回數據是json,程序讀寫會方便一些。 以下是提交數據為 json,返回數據也為 json的例子:

function  sendSuccess(data, status)  {
    if(status!=='success') {
        alert('Error');
        return false;
    }

    alert(data.message);
}

$('#myForm2').ajaxSubmit({
    dataType:'json',
    success: sendSuccess
});

以下是官網的一個例子:

// prepare the form when the DOM is ready
$(document).ready(function() {
    var options = {
        target:        '#output2',   // target element(s) to be updated with server response
        beforeSubmit:  showRequest,  // pre-submit callback
        success:       showResponse  // post-submit callback

        // other available options:
        //url:       url         // override for form's 'action' attribute
        //type:      type        // 'get' or 'post', override for form's 'method' attribute
        //dataType:  null        // 'xml', 'script', or 'json' (expected server response type)
        //clearForm: true        // clear all form fields after successful submit
        //resetForm: true        // reset the form after successful submit

        // $.ajax options can be used here too, for example:
        //timeout:   3000
    };

    // bind to the form's submit event
    $('#myForm2').submit(function() {
        // inside event callbacks 'this' is the DOM element so we first
        // wrap it in a jQuery object and then invoke ajaxSubmit
        $(this).ajaxSubmit(options);

        // !!! Important !!!
        // always return false to prevent standard browser submit and page navigation
        return false;
    });
});

// pre-submit callback
function showRequest(formData, jqForm, options) {
    // formData is an array; here we use $.param to convert it to a string to display it
    // but the form plugin does this for you automatically when it submits the data
    var queryString = $.param(formData);

    // jqForm is a jQuery object encapsulating the form element. To access the
    // DOM element for the form do this:
    // var formElement = jqForm[0];

    alert('About to submit: \n\n' + queryString);

    // here we could return false to prevent the form from being submitted;
    // returning anything other than false will allow the form submit to continue
    return true;
}

// post-submit callback
function showResponse(responseText, statusText, xhr, $form)  {
    // for normal html responses, the first argument to the success callback
    // is the XMLHttpRequest object's responseText property

    // if the ajaxSubmit method was passed an Options Object with the dataType
    // property set to 'xml' then the first argument to the success callback
    // is the XMLHttpRequest object's responseXML property

    // if the ajaxSubmit method was passed an Options Object with the dataType
    // property set to 'json' then the first argument to the success callback
    // is the json data object returned by the server

    alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
        '\n\nThe output div should have already been updated with the responseText.');
}

jQuery Validation — jquery.validate.js

jQuery Validation 插件為表單提供了強大的驗證功能,讓客戶端表單驗證變得更簡單,同時提供了大量的定制選項,滿足應用程序各種需求。功能如下:

  • 自帶多種規則,譬如 email url number 等
  • 自定義 錯誤提示 標籤
  • 自定義 錯誤提示 內容
  • 自定義 驗證函數

加載&安裝

<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.19.5/dist/jquery.validate.min.js"></script>

列子:

 $(function (){
    $.validator.methods.length4 = function(value, element, param) {
        return value.length == param;
    };
    $("#contactForm").validate({
        // errorClass: "check",
        errorElement: "span",
        errorPlacement: function(error, element) {
            error.appendTo(element.parent());
        },
        submitHandler: function(form) {
            jQuery(form).ajaxSubmit({
                dataType:'json',
                success: sendSuccess
            });
        }
    });
});
  • length4 是自定義 判斷長度的規則。
  • errorElement 定義錯誤信息的標籤。
  • errorClass 定義錯誤內容的 css 樣式
  • errorPlacement 定義錯誤信息出現在哪裡。

以上設定會在指定的地方出現:

<span id="lastName-error" class="error">Required</span>

submitHandler 自定義了當 驗證都通過後需要執行的內容。

Javascript IIFE自调用表达式

在 JavaScript 中,您可以使用自調用表達式(也稱為自執行函數)來創建一個立即執行的函數。這種函數會在定義後立即執行,並且通常用於創建一個作用域,以防止外部代碼訪問內部變量。

書寫格式:

(function () {
  // …
})();

(() => {
  // …
})();

(async () => {
  // …
})();

以下是一個立即執行函數的示例:

(function() {
  var secretVariable = "This is a secret";
  console.log(secretVariable);
})();

在上面的代碼中,我們定義了一個自調用函數,它創建了一個名為 secretVariable 的變量,並將其輸出到控制台。由於該函數是立即執行的,因此 secretVariable 的值不會暴露給外部代碼。

您還可以將參數傳遞給立即執行函數。以下是一個帶有參數的示例:

(function(value) {
  console.log(value);
})("Hello, World!");

在上面的代碼中,我們將字符串 “Hello, World!” 作為參數傳遞給自調用函數,並在函數內部將其輸出到控制台。

JavaScript async和defer作用

在JavaScript中,async和defer是兩個屬性,它們用於控制腳本的加載和執行方式。

在浏览器加载 script 时, 如果没有 async和defer。 则表示立刻执行。

async屬性是用於標記一個腳本是否異步加載和執行。當腳本的async屬性為true時,瀏覽器會在需要時異步加載該腳本,並且在加載完成後立即執行。這意味著腳本的執行不會阻塞頁面的解析和渲染。
以下是一個使用async屬性的示例:

<script async src="script.js"></script>

在這個例子中,script.js會異步加載並在加載完成後執行。 另一方面,defer屬性是用於控制腳本的執行時間。當腳本的defer屬性為true時,瀏覽器會延遲執行該腳本,直到文檔解析完成後才會執行。這意味著腳本的執行不會阻塞頁面的解析和渲染。
以下是一個使用defer屬性的示例:

<script defer src="script.js"></script>

在這個例子中,script.js會延遲執行,直到文檔解析完成後才會執行。

總之,async和defer屬性都是用於控制腳本加載和執行的方式,它們可以幫助優化頁面的性能和用戶體驗。