Frontend

Promise 獨立介紹篇

Promise 已經被ES6及新的瀏覽器支援,是一個強大的異步執行流程語法結構

Promise 可以讓我們確保某件事情做完之後,才進行後續動作

本質上都是使用callback(回呼函式),並且都是async(異步執行)

當我們實際執行一個 promise,他會先將狀態切換為 pending(等待中),並且依照 resolve 或reject 來返回結果

then..catch 連鎖處理

我們可以透過 Promise 來進行 then..catch 連續的連鎖流程處理

Promise.all 方法

promise.all 可以用陣列的方式一次帶入多個promise,

執行到最後會再回傳一個 Promise 物件

有幾點特色:

  • 一項被reject或發生錯誤,就會返回 reject
  • 全部執行都完成 resolve ,才會返回成功resolve
  • 返回的resolve promise順序會跟傳入陣列中的順序一致

promise.race 方法

promise.race 同樣可用陣列的方式一次帶入多個promise,

只要有任何一個值完成,無論是resolve, reject 還是錯誤,都會返回結果

如果傳入的 promise 同時完成,只會返回排陣列在第一位置的 promise 值

Continue Reading

Arrows Function 獨立介紹篇

ES6 Arrows Function 和 Normal Function 差別

Arrow Function 主要有以下優勢:

  • 語法簡單。少打很多字元。
  • 可以讓程式碼的可閱讀性提高。
  • 會參照當時環境中的 this ( bind(this) )

好處

在使用內部函式時,內部函式有自己的this,通常會指向最外部 windows 物件,

因此,通常要先用變數指定this,傳到內部函式使用,

而 Arrow function 則不必再透過變數就能直接使用外部函式的this作為自己的this

注意情況

在物件裡的屬性,必須使用function,而不能使用 Arrows function

箭頭函式不能當作generators使用,使用yield會產生錯誤。

Continue Reading

Javascript Closure 獨立介紹篇

當我們宣告且呼叫一個函式時,函式本身會形成一個 scope,scope 裡面會包含 Closure

特性

Closure 原則就是,是一個可以用 by Reference 的方式紀錄函式建立時的環境,包括了:

Closure 內部所建立的變數,限定於內部使用,

在Closure 裡也可以存取到 Scope chain 中的所有變數,

Continue Reading

Javascript function 獨立介紹篇

Javascript 最難理解的源頭,始於 function

First Class Functions

https://pjchender.blogspot.tw/2016/03/javascriptfunctionobjects.html First Class Functions(一級函式)的概念,是指其他類型(Objects, String, Boolean, Numbers)做的事, Function都能做,包括將Function指定成一個變數等等 (assign them to variables, pass them around, create them on the fly)。

  • 函式只是物件的一種
  • 可以將 function 儲存成變數
  • 可以將 function 當成參數代入另一個 function 中
  • 可以在一個 function 中回傳另一個 function
  • function 跟物件一樣有屬性(property)

function只是一種特殊的物件,它可以被當作物件來使用

所有函式都是物件中的"方法"

function 本身有幾個scope(作用域):

  1. 函式本身
  2. 外部函式內容(如果是函式中的函式,可存取外部函式內容)
  3. 全域

Continue Reading

React 入門

React 是一個 View 框架,主要的用途有幾個:

  • 將UI物件化
  • 運用 props 來傳輸數據
  • 依照 state 變化來調整 view
  • 使用虛擬 DOM 提升效能

在開始之前,請預先安裝 webpack + babel + react依賴環境

接下來,會一步步來說明:

Continue Reading

用 Yarn + webpack 2 + Babel 架設 React 環境

Webpack 是一個 module 整合工具,用來將javascript 打包成一支讓瀏覽器能夠運行的 bundle.js。

看似簡單,但其實功能非常強大

webpack 的功能:

  • 和 Browserify一樣,可以整合 ES Modules, CommonJS 及 AMD modules,減少依賴進而加速了運行的時間
  • 可以將js打包成單一個 bundle.js 或者多個可以非同步載入的模塊(需搭配plugin,可減少初期載入時間)
  • 可結合babel等編譯器,進行文件預編譯功能。例如,將 JSX、ES6、Typescript…轉javascript,Handlebar 字串({{expression}}) 編譯,images 轉 Base64等

此外,還有一些 plugin 可以使用

例如 common-chunks-webpack-plugin - 可以將一些要再多地方共享的模組拆分成獨立的 bundle extract-text-webpack-plugin - 可以將 bundle 中的 CSS 另外存成一支 app.bundle.css html-webpack-plugin - 可用來動態產生HTML內容,並且會自動將打包過的js整合再一起 i18n-webpack-plugin - 可製作多國語系 compression-webpack-plugin - 壓縮內容

Continue Reading

Babel 入門

本文是依據 Babel 官網及網路參考資料逐步學習記錄的內容

Babel 這個壞男孩(發音似 Bad boy) 喜歡追求新潮的東西,同時內心是個文青,熱愛老東西。所以,當他接觸到新的內容,就會想盡辦法與舊事物融合~ 只能說個性實在完美

每當有新的javascript語法(例如ES2015-ECMAScript 6)出現,都只能靜待瀏覽器支援才能決定是否採取行動。 為了解決這樣的痛點,Babel就出現了。

Continue Reading

Browserify 入門

本文是依據 Browserify 官網及網路參考資料逐步學習記錄的內容

Browserify 讓我們可以在瀏覽器中使用Node.js 風格的模組,不管是 AMD / CMD / ES6 …..風格的模塊化,它都能認識,並且編譯成瀏覽器認識的JS。

Browserify 運作的方式,會先在代碼中以靜態分析(static analysis)搜尋有調用 require()的內容,彙整出調用依賴關係圖(dependency graph),並且將關鍵字解析成路徑,然後根據路徑找到檔案, 接著,檔案會被打包(bundle)成單一獨立的 javascript 檔案,讓你可以直接在網頁中直接使用。 並且,打包的檔案預設都會使用嚴格模式 ```use

接下來,開始介紹 Browserify 安裝方式及用法說明:

Continue Reading

nodejs Cannot find module xxx 解法

在使用 nodejs ,時常遇到版本無法支援的狀況,導致會出現找不到相關模組的情況

例如: Cannot find module ‘github-url-from-git’

處理的方式分別有以下幾種

Continue Reading

設計師必備的 30 個高質感免費字型 [ 熱門蒐藏]

最新推薦給設計師30個高質感免費字型,適用於大標題、Logo、T恤、標籤、海報、徽章等用途。每一個字型都是經過精挑細選,讓你可以用來創造更具有個人風格的設計專案,並且這些字型都能免費提供個人或商業用途,非常值得蒐藏。

Continue Reading

單頁應用程式的登入權限驗證 - 開源標準規範 JSON Web Tokens

在一頁式網頁架設登入系統通常是一件非常麻煩棘手的事情,

在一開始要思考的是該挑選哪個主流框架 Angular、React或Vue…

然後開始建立一個前後端分離的架構,只透過RESTful API來進行溝通,

在這樣的架構下,搭建CMS相當容易,前端通常只需要取得資料後,進行render出來即可,

##SESSION BASE 無用武之地 如果要建設會員或管理者權限功能,傳統 session-based 的權限登入方式相當簡單,

但是在透過 RESTful API 應用的框架中,session-based的方式則行不通,

此外,單純使用SESSION的情況,也必須解決資料跨 Server 的問題

Token

Token是一串加密字串,並儲存在前端, 當使用者再次操作時,就能在後端從資料庫中比對token, 檢查是否為有效的使用者, 但是這樣的查詢也會產生伺服器的負擔

Continue Reading

瀏覽器語言偵測

Language of the browser: zh-TW

var x = "Language of the browser: " + navigator.language;

var txt = "";
txt += "<p>Browser CodeName: " + navigator.appCodeName + "</p>";
txt += "<p>Browser Name: " + navigator.appName + "</p>";
txt += "<p>Browser Version: " + navigator.appVersion + "</p>";
txt += "<p>Cookies Enabled: " + navigator.cookieEnabled + "</p>";
txt += "<p>Browser Language: " + navigator.language + "</p>";
txt += "<p>Browser Online: " + navigator.onLine + "</p>";
txt += "<p>Platform: " + navigator.platform + "</p>";
txt += "<p>User-agent header: " + navigator.userAgent + "</p>";
<script type=text/javascript>
        // if( (/http\:\/\/t\.smartisan\.com\/smartisan\/modules\/index\/\#\/$/g).test(location.href)) {
        if( (/http\:\/\/www\.smartisan\.com.$/g).test(location.href) || (/http\:\/\/www\.smartisan\.com\/\#\/$/g).test(location.href)) {
            // ['ja', 'en-GB', 'en', 'en-US', 'fr', 'es', 'ko', 'de'];
            // 首页,如果是英文环境,则跳到 en
            if((/en/gi).test(navigator.language)) {
                location.href = 'http://www.smartisan.com/en/';
            }
            // 首页,如果是日文环境,则跳到 jp
            else if((/(jp|ja)/gi).test(navigator.language)){
                location.href = 'http://www.smartisan.com/jp/';
            }
        }
    </script>

Continue Reading

如何用CSS自定義checkbox以及radio按鈕樣式

目前有很多客製化form element的套件, 但是這次專案只需要客製checkbox及radio, 由於這樣的類子很常用到,就直接在這裡就做個紀錄,方便之後查詢 如何透過CSS來客製化HTML checlbox 及radio buttons

Continue Reading

基本型態 Typescript - Basic Types [中文]

安裝typescript

npm install -g typescript

接著測試看看是否能正常運作 先建立一個 helloworld.ts 內容寫入

let hi: string = "helloworld";

接著在下指令

tsc helloworld.ts

如果有產生一個對應的helloworld.js 那就代表能正常運作

var hi = "helloworld";

#Basic Types 紀錄一些Typescipt基本型態用法,主要參考自Typescript官網 Basic Types https://www.typescriptlang.org/docs/handbook/basic-types.html

##Boolean

let isDone: boolean = false;

##Number 在typescirpt中,所有numbers都是以符點數來表示,因此可以支援十六進位、十進位、八進位、二進位數值格式。

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

Continue Reading

Content Security Policy 內容安全策略

https://www.smashingmagazine.com/2016/09/content-security-policy-your-future-best-friend/ http://www.ruanyifeng.com/blog/2016/09/csp.html

Content Security Policy - 簡稱 CSP,是一個瀏覽器安全保護使用者的策略。

主要用於降低 cross-site scripting (XSS) 的風險。

網站傳送Header時﹑夾帶 CSP header 告訴瀏覽器哪些是合法的內容,哪些是不合法的。

在基本的規則中,Header meta name 命名為 Content-Security-Policy 接下來就可以定義規則 定義的方式可以依照你使用的環境及語法而定 首先可以直接使用HTML meta的方式來定義 例如:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

也可以透過 HTTP 的header訊息 : Content-Security-Policy 這裡主要會針對PHP header的方式來定義 這裡是一個PHP範例:

<?php
    header("Content-Security-Policy: <your directives>");
?>

通常,在定義CSP規則時,可以定義合法的圖片來源、script 來源、css來源、iframe來源 當然,也可以直接讓本文的script合法,但不建議這樣處理。例如,我們會再本頁HTML中用