# An articles a day for 30 days
## 希望是最淺顯易懂的 RxJS 教學
https://blog.huli.tw/2017/12/08/introduction-to-rxjs-observable/#more
看到一半就看不懂了...只好從RxJS官網開始
### RxJS
What makes RxJS powerful is its ability to produce values using pure functions. That means your code is less prone to errors.
Normally you would create an impure function, where other pieces of your code can mess up your state.
#### Pure function vs Impure
Pure:
* predictable
* no side-effects
Can't do the following:
Ex. Modifying a global variable, Modifying an argument, Making HTTP requests, DOM manipulation, Reading/writing files.
```
// PURE FUNCTION 👼
const pureAdd = (num1, num2) => {
return num1 + num2;
};
//always returns same result given same inputs
pureAdd(5, 5);
//10
pureAdd(5, 5);
//10
//IMPURE FUNCTION 😈
let plsMutateMe = 0;
const impureAdd = (num) => {
return (plsMutateMe += num);
};
//returns different result given same inputs
impureAdd(5);
//5
impureAdd(5);
//10
```
RxJS有三個特點:
1. Purity
ability to produce values using pure functions
```
//Normal JS => Impure
let count = 0;
document.addEventListener('click', () => console.log(`Clicked ${++count} times`));
//RxJS
import { fromEvent } from 'rxjs';
import { scan } from 'rxjs/operators';
fromEvent(document, 'click')
.pipe(
scan(count => count + 1, 0))
.subscribe(count => console.log(`Clicked ${count} times`)
);
```
2. Flow
has a whole range of operators that helps you control how the events flow
```
//Normal
let count = 0;
let rate = 1000;
let lastClick = Date.now() - rate;
document.addEventListener('click', () => {
if (Date.now() - lastClick >= rate) {
console.log(`Clicked ${++count} times`);
lastClick = Date.now();
}
});
//RxJS
import { fromEvent } from 'rxjs';
import { throttleTime, scan } from 'rxjs/operators';
fromEvent(document, 'click')
.pipe(
throttleTime(1000),
scan(count => count + 1, 0)
)
.subscribe(count => console.log(`Clicked ${count} times`));
```
3. Values
transform the values passed through your observables
```
//Normal
let count = 0;
const rate = 1000;
let lastClick = Date.now() - rate;
document.addEventListener('click', event => {
if (Date.now() - lastClick >= rate) {
count += event.clientX;
console.log(count);
lastClick = Date.now();
}
});
//RxJS
import { fromEvent } from 'rxjs';
import { throttleTime, map, scan } from 'rxjs/operators';
fromEvent(document, 'click')
.pipe(
throttleTime(1000),
map(event => event.clientX),
scan((count, clientX) => count + clientX, 0)
)
.subscribe(count => console.log(count));
```
### React + Redux 的非同步解決方案:redux-observable
React + Redux 這一套非常常見的組合,一直都有一個問題存在,那就是沒有規範非同步行為(例如說 API)到底應該怎麼處理。而開源社群也有許多不同的解決方案,例如說 redux-thunk、redux-promise、redux-saga 等等.
因此,Netflix 就開源了這套redux-observable,用 RxJS 來處理非同步行為。
在 redux 的應用裡面,所有的 action 都會通過 middleware,你可以在這邊對 action 做任何處理。或者我們也可以把 action 看做是一個 Observable,例如說:
```
Rx.Observable.from(actionStreams)
.filter(action => action.type === 'GET_USER_INFO')
.switchMap(
action => Rx.Observable.from(API.getUserInfo(action.payload.userId))
)
.subscribe(userInfo => {
dispatch({
type: 'SET_USER_INFO',
payload: userInfo
})
})
```
redux-observable 是一個 middleware,你可以在裡面加上很多epic,每一個epic就是一個 Observable,你可以監聽某一個指定的 action,做一些處理,再轉成另外一個 action。
### More to read
https://ithelp.ithome.com.tw/users/20103367/ironman/1199
---
# To finish
## 你所不知道的各種前端 Debug 技巧
https://ithelp.ithome.com.tw/m/articles/10238903
## 今晚,我想來點 Web 前端效能優化大補帖!
https://ithelp.ithome.com.tw/m/users/20113277/ironman/3877?fbclid=IwAR3lFxDWNAcd-BaltaiOkx2qM7-SElXgEeXUDdUS5G2ngB_JQ0Y30KgdKFg
前端的效能優化
* Loading Time
ex. Code Splitting
* 執行時期 (Runtime)
ex. Virtualized List
### 補充
CSS 架構的動畫通常是由瀏覽器「主執行緒」的另一獨立執行緒處理;而樣式、版面配置、繪製與 JavaScript 都是在主執行緒上處理。
https://developers.google.com/web/fundamentals/design-and-ux/animations/animations-and-performance?hl=zh-tw#css-vs-javascript-performance
## HTML Character Sets
> 今天在看公司程式碼時,看到`-`用`&mdash` 表示,好奇為什麼不直接用`-`就好。
---
# To Read
## 密碼要怎麼儲存才安全?該加多少鹽?-科普角度
https://blog.darkthread.net/blog/store-pwd-safely/?fbclid=IwAR2tOo5W5l-8ftpX6A45cein88HpPTKzSN5qDFXipJJMWXG0pzC5C2uncF8