✍️Lập trình
-
Cloud, webhook, API:
- API đưa thông tin là thụ động. Webhook đưa thông tin chủ động
- Cloud bản chất là đi thuê local của người khác
- Cloud, webhook, API
- Endpoint
- Các API thường dùng cho PHP
- Facebook API
- Fb hạn chế rất nhiều API để tránh việc làm nhái page
- me-accounts liệt kê tất cả các page mình quản lý
- Non-ASCII or non-English characters in field or database names will be transliterated to English
- Build service object
- Node là một vật thể có ID riêng. Edge là vật thể liên kết giữa các node. Field là thuộc tính của vật thể
- Node với edge được gọi chung là endpoint
- Auth không phải là xác thực
- Authorization sinh ra access token để client sử dụng
- Client gửi access token đến authorization server để được truy cập
- Client ID là để authorization server biết client nào là client nào, còn client secret là để nó đảm bảo rằng client này chính là client đó
- Client là ứng dụng muốn truy cập vào dữ liệu của user
- Khi access token hết hạn truy cập, client gửi refresh token đến authorization server để được cấp access token mới
- OAuth giúp vẫn biết user kể cả khi user đổi mật khẩu
- OAuth là cách để cấp quyền truy cập dữ liệu mà người dùng không phải cấp mật khẩu
- Redirect URI là nơi
- Scope là những phạm vi dữ liệu khi ứng dụng truy cập
- ❓OAuth là cấp phép cho ai, token là cấp phép được làm cái gì
- Web service là những API dùng trên HTTP
-
Công cụ:
- Container chỉ là một process
- Container là phù du
- Có vẻ như ngày xưa engine với daemon là một
- Docker Desktop tạo ra một máy ảo để chạy docker engine
- Docker
- Engine bao gồm CLI client, API và deamon
- exec để chạy lệnh cho một container đang chạy
- Image là template để chạy container
- Mỗi một dòng trong dockerfile sẽ tương ứng với một step khi dựng image
- Nếu dựng lại image mà đánh tag giống nhau thì image cũ sẽ thành danling image
- Việc dựng image được thiết lập qua dockerfile
- Volume là cách để đồng bộ dữ liệu giữa máy chủ và máy ảo
- Bấm F12 để biết thêm thông tin về biến
- Các biểu tượng dùng trong VS Code
- Dùng snippet để viết tắt code
- Giao diện VS Code
- Hằng là xanh lợt, biến là xanh đậm
- Language server là thứ khiến cho IDE hỗ trợ tốt hơn việc lập trình
- launch.json dùng để thiết lập debugger
- Nhiều người có thể cùng chỉnh sửa cùng lúc như Google Docs
- Phím tắt trong VS Code
- Plugin hay cho người mới
- setting.json giúp tuỳ chỉnh thiết lập theo ý mình
- Video hướng dẫn
- VS Code chỉ là code editor, không phải IDE
- VS Code nhiều khi không tìm hết file được do tên quá dài
- Đường dẫn trong launch.json là cwd
- Debugger
- Không cần viết hàm quản lý debug khi đã có logpoint
- Dùng logpoint thay cho console.log() khi debug
- Launch vs attach
- Dùng test khi muốn biết code chạy có đúng không. Dùng debug khi muốn biết code chạy sai chỗ nào
- Dễ xem kết quả các giá trị trong console debug hơn là ở Variables
- console.log chỉ hiển thị nội dung tại thời điểm vật thể được xem, chứ không phải vào lúc lệnh được thực thi
- Ngoài console.log còn có console.assert, console.trace, console.table, console.error
- Tổng quan về log
- Log, test, debug
- Lý do thấy test trước bất tiện
- Tổng quan về kiểm thử phần mềm
- Unit test
- Prettier là để làm cho dễ nhìn. Linter là để hạn chế dính bug khi dự án mở rộng
-
Hệ điều hành, path và terminal:
- Admin privilege
- Bạn không cần dùng GUI
- Article dùng cho những nội dung độc lập, chứ không nhất định phải là một bài viết dài
- Biến môi trường giúp ta điền những giá trị lặp đi lặp lại nhanh hơn
- Dùng absolute path cho lành
- env của người dùng được ưu tiên hơn env của hệ thống. Nhưng với biến path thì ngược lại
- PATH là đường dẫn mặc định tới những tập tin nhị phân (binary)
- pwd là thư mục mà process sẽ chạy (process working directory). cwd là thư mục mà mình đang ở đó (current working directory)
- Việc có khoảng trắng trong tên file sẽ khiến việc xử lý code phức tạp hơn
- Đường dẫn đến tệp ngoài trong một script phụ thuộc vào cwd, không phải đường dẫn tới script mình đang viết
- Sự khác biệt giữa Windows và Android, Mac trong tên file
- cmd vẫn được dùng để chạy exe
- cmdlet dùng định dạng Verb-Noun
- Các lệnh PowerShell thường dùng
- PowerShell là một ngôn ngữ shell
- Windows Terminal có thể được kích hoạt trong Explorer
- Shell là cái vỏ bảo vệ lõi của hệ điều hành
- Subcomand không có gạch. Flag có gạch
- Terminal là cái chương trình để làm việc với shell
- Terminal, console, shell và command line thường được dùng lẫn lộn với nhau
- Cài win mới
- Local app data
- Windows rất lằng nhằng trong việc thiết lập cấu hình
-
Khái niệm cơ bản và nguyên lý lập trình:
- Compile time là lúc chuyển từ ngôn ngữ lập trình mà người hiểu sang ngôn ngữ máy chỉ có máy mới hiểu. Runtime là lúc máy chạy mã máy
- Khái niệm cơ bản và nguyên lý lập trình
- 4 đặc điểm của lập trình hướng vật thể
- Biểu thức (expression) là những thứ trả lại một giá trị nào đó
- Hoạt động trung tâm của lập trình hướng vật thể là phân loại
- Giao diện là cái khuôn của phương thức
- Hàm cần gọi phải ở trong then
- Hàm vô danh chính là lambda
- Phương thức cho ta biết mình có thể làm gì với vật thể đó
- Phương thức là một thuộc tính của vật thể
- Phương thức phải gắn lên một vật thể cụ thể nào đó để có tác dụng
- this, self là cách để nói rằng hành động mà phương thức sẽ làm sẽ phải gắn lên một vật thể cụ thể của lớp, thứ mà bây giờ chưa được tạo ra
- Để tránh phụ thuộc lòng vòng (circular dependency) có thể dùng hàm
- API là giao diện của một chương trình
- Giao diện là cách để sử dụng vật thể mà không cần biết bên trong nó có gì
- Khi import một hàm thì cả file chứa hàm đó sẽ được chạy. Các import cũng sẽ chạy theo, dù là để import vào một hàm khác mình không import
- Nên tách bạch file util cho client và util cho server
- Package và library là những cái tên khác nhau cho cùng một thứ
- Chưa rõ lý do vì sao lại dịch object ra thành đối tượng chứ không phải vật thể
- Dùng class khi ta có logic nghiệp vụ thực sự cần được implement để thực thi. Dùng interface để tạo ràng buộc kiểu cho biến
- Không cần biết vật thể chứa dữ liệu gì, chỉ cần quan tâm nó làm được gì
- Lớp là một cái khuôn để tạo các vật thể cho nhanh
- Những vật thể đơn giản dùng để tra cứu dữ liệu theo từ khoá gọi là từ điển
- Prototype là những thuộc tính không cần tạo ra cũng có sẵn
- Thay vì ta thao túng trực tiếp dữ liệu, ta điều khiển vật thể qua phần giao tiếp của nó với bên ngoài
- Từ điển là vật thể được dùng để tra cứu dữ liệu theo từ khoá chứ không phải là để thao tác và thay đổi thuộc tính bằng phương thức
- Việc đóng gói (encapsulation) giúp ta không cần quan tâm vật thể lưu dữ liệu thế nào, mà chỉ cần quan tâm tới thuộc tính và phương thức của nó
- Vật thể ngoài tự nhiên không chứa hướng dẫn để sử dụng nó. Vật thể trong máy tính có hướng dẫn sử dụng nó
- Vật thể được tạo nên bởi những thuộc tính
- Bộ nguyên lý SOLID giúp phần mềm dễ bảo trì, dễ mở rộng
- Cái trừu tượng không nên phụ thuộc vào những cái cụ thể mà những cái cụ thể nên phụ thuộc vào cái trừu tượng
- Mảng các vật thể và mảng các mảng
- Mặc dù mảng lưu giữ thứ tự, nhưng nhiều khi ta không quan tâm đến thứ tự đó cho lắm
- Mẫu thiết kế (design pattern) là những giải pháp cho những vấn đề thường gặp trong lập trình mà nhiều thế hệ lập trình viên đã đúc kết và chứng minh tính hiệu quả của nó
- Nguyên lý
- Stable = the APIs are not expected to change in a breaking way. Production ready = supports its intended usecases and doesn’t contain major bugs.
- Giao diện người dùng, logic, dữ liệu là 3 thành phần cơ bản cho một chương trình. Chúng có mục tiêu khác nhau, kỹ thuật xử lý khác nhau. Không thể trộn lẫn lộn với nhau được.
- Model không biết đến View, View không biết đến Controller
- Block comment dành cho việc giải thích ý tưởng của code, viết doc. Line comment để debug hoặc hướng dẫn editor đọc code của mình (directive)
- Bản thân việc lập trình bằng ngôn ngữ bậc cao đã là một dạng comment
- Comment có thể cho thông tin sai, nhưng code thì không
- Comment cũng có bug, nhưng không giống như code, không có chương trình nào hỗ trợ debug được nó
- Giải thích về thuật toán, các đánh đổi trong việc ra quyết định hoặc dẫn nguồn là các lý do tốt để comment
- Hãy viết code sao cho mình khỏi comment
- Thay vì comment, hãy document. Thay vì giải thích cách code hoạt động, hãy hướng dẫn cách sử dụng nó
- Viết comment
- Việc tách một khối code thành một hàm khiến cho việc đọc từng dòng trở thành đọc từng bước
- while familiarity is a perfectly fine reason, it is really a bad sign if it is the only reason
- Mỗi lớp, hàm, mô đun chỉ đảm nhiệm một nhiệm vụ xác định
- Sự couple dễ được sinh ra khi muốn xử lý các dữ liệu giống nhau về chức năng và na ná nhau về cấu trúc và cách xử lý
- Tránh dùng hàm lồng để làm giảm sự couple
- Việc chia các lệnh trong kịch bản thành các hàm nhỏ hơn sẽ giúp dễ bắt lỗi hơn
- Quy ước đặt tên biến
- toString hoặc href sẽ luôn thêm slash vào sau
- Việc biến đổi dữ liệu chủ yếu là để người dùng đọc cho tiện, và để máy kiểm tra dữ liệu
- Việc đặt tên không có tiền tố gì sẽ tiện khi nó thường được dùng thường xuyên ở những nơi khác, ở trong một danh sách, hoặc liệt kê các thuộc tính
-
Ngôn ngữ:
- Các ký tự đặc biệt trong các ngôn ngữ khác nhau
- AutoHotkey combines 3 concepts into 1 built-in basic object type
- Tạo phím tắt bằng AutoHotKey
- Các ngôn ngữ lập trình tiến hoá dần để trở thành Lisp
- Biến được so sánh với nhau bằng địa chỉ bộ nhớ, không phải giá trị thực sự của biến
- Biến được tạo mà không có từ khoá khai báo (var, let, const) luôn là biến toàn cục, kể cả khi được tạo trong hàm
- await với async là cách để viết hàm bất đồng bộ với tư duy khi viết hàm tuần tự
- callback là một hàm được truyền vào một hàm khác giống như một tham số bình thường
- Callback là những hàm được dùng như đối số của hàm khác
- Dùng await trong filter sẽ chẳng filter được gì
- Hàm gọi hàm callback đã xác định sẵn tham số truyền vào cho callback. Callback bắt buộc phải có đúng thứ tự và kiểu biến được hàm gọi cho trước
- Promise chỉ là một vật thể để việc lập trình được tiện hơn, không phải là một tính năng mà những phiên bản JS trước không làm được
- Promise được sinh ra là để không phải dùng if lồng quá nhiều
- Thực chất promise không giải quyết được chuyện lồng, vì promise cũng lồng vào nhau như if thôi. Thứ nó giải quyết là việc các giá trị trả về từ promise trông như không lồng vào nhau gì cả
- JSON.stringify(new Error()) trả về một vật thể rỗng
- object Object xảy ra khi một vật thể bị chuyển sang dạng chuỗi
- String(x) giống x.tostring(), nhưng không gây ra lỗi nếu x là null hoặc undefined
- Dùng map tiện hơn dùng for vì nó tạo ra một mảng mới cho mình và không cần phải lo mảng cũ bị sửa đổi
- f(a)(b) để gọi hàm f(a) có chứa hàm con f1(b)
- Luôn dùng for of, đừng dùng for in
- Named export thường dùng cho các file lưu trữ nhiều function, object như utils, constant, api, store… Export default thường dùng cho class, function component
- Phương thức json() của Request và Response là để chuyển từ dạng chuỗi sang vật thể
- Mọi sự kiện đều capture và target, nhưng không phải sự kiện nào cũng bubble
- Sự kiện
- Dùng nullish coalescing operator thay cho toán tử OR khi 0, ‘’, NaN cần được trả về true chứ không phải false
- Luôn dùng ===. Nếu không có lý do hợp lý thì đừng dùng ==
- Mọi phép so sánh với NaN đều trả về false
- Lịch sử phát triển của JavaScript
- Bundler dùng để gom hết tất cả các script lại vào làm một
- Các chương trình dùng electron ngốn ram
- Cứ 4kb thì tạo thành một read unit, chứ không phải là một lần chạy lệnh
- deno info giúp thấy chỗ script được chuyển sang JS
- Dùng Array.fromAsync để việc lấy dữ liệu từ KV không phải chờ tải về hết rồi mới bắt đầu lọc
- Làm quen Deno cho người mới
- Sau một thập kỷ phát triển, tác giả của Node viết Deno để khắc phục những thiếu sót của Node
- Những API của môi trường thực thi không chạy được trên trình duyệt
- Cần thiết lập EMS cho node trước khi chạy
- node.js là cách để dùng JS ở backend
- npm là chương trình quản lý package cho node.js
- package.json dùng để thiết lập node
- Runtime là lúc chạy. Runtime environment là môi trường thực thi
- strick mode là chế độ code nghiêm ngặt, nó bắt buộc lập trình viên phải tuân thủ theo quy tắc mà javascript đưa ra
- Temporal được sinh ra để giải quyết rắc rối của Date
- VanillaJS chỉ là JS bình thường
- as, is là những cách để nói cho TS biết là mình hiểu nhiều hơn nó
- Chỉ thị ba dấu gạch chéo cung cấp chỉ dẫn cho TS
- Các ký hiệu trong TS
- generic là biến dành cho kiểu
- generic là cách để giữ được tính chung chung mà vẫn không bị mất thông tin
- generic là tính từ, không phải danh từ
- Index signature giúp khai báo kiểu của tên thuộc tính và giá trị của nó trong vật thể, dù không biết vật thể đó có cấu trúc thế nào
- Index signature và record là các cách khai báo kiểu vật thể
- Nếu dữ liệu không nhất thiết ở dạng vật thể thì type gọn hơn và linh hoạt hơn. Nếu đã xác định dữ liệu cần ở dạng vật thể thì interface sẽ thể hiện tốt ý tưởng của người viết hơn
- satisfied là để kiểm tra xem dữ liệu mình nhập bằng tay có thoả kiểu hay không
- DefinitelyTyped
- Dùng string-ts để bắt kiểu cho chuỗi được tốt hơn
- Dùng ts-reset để sửa những lỗi kỳ lạ của TS
- Người mới học TS thì nên cài extension Total TypeScript để bớt sợ
- Thay vì dùng Copilot để gợi ý code, có thể dùng 30 seconds of TypeScript
- TS chỉ có thể bắt lỗi kiểu dữ liệu trong lúc viết code. Zod giúp bắt lỗi kiểu do người dùng trả về
- tsc là TypeScript compiler, là thứ dịch TypeScript sang JavaScript
- tsconfig
- TypeScript
- void là kết quả của những hàm không trả kết quả nào
- Nếu lớp không định nghĩa cả repr() và str() thì kết quả trả về có dạng main.Class_name object at 0x1025c4ed0
- Trong REPL, gọi trực tiếp vật thể ra thì kết quả là repr(). Nếu dùng print thì kết quả là str()
- repr() trả về mô tả chi tiết để người lập trình bảo trì và sửa lỗi. str() trả về mô tả đơn giản cho người dùng sử dụng
- elif là để phân biệt else thuộc if nào
- Exception
- IPython
- Jupyter notebook giúp chạy lệnh theo từng ô kèm diễn giải
- Không thể thay đổi tuple một khi đã được tạo ra
- Những phương thức có hai dấu gạch dưới hai bên được gọi là dunder (double underscore)
- Anaconda giống như một fork Python có bổ sung thêm nhiều công cụ cho khoa học dữ liệu
- Conda là trình quản lý thư viện, không chỉ của Python mà còn của các ngôn ngữ khác
- venv chỉ tạo môi trường ảo cho phiên bản hiện tại. Miniconda tạo môi trường ảo cho nhiều phiên bản
- Với những người chỉ cần dùng Python để làm dữ liệu chứ không lập trình, chỉ cần cài Anaconda là đủ. Không cần và không nên cài Python riêng
- Khi chạy Python trong VS Code, thư mục được chạy không phải là thư mục chứa script
- Nên cài Python bằng bộ cài tải từ website nếu muốn lập trình
- Pip là chương trình quản lý package của Python
- py là chương trình hỗ trợ việc quản lý phiên bản trên Windows
- venv tạo môi trường ảo để tránh trường hợp chồng chéo các gói và xung đột phiên bản giữa các thư viện
- Việc cài phiên bản mới không xoá phiên bản cũ đi khiến cho người mới hay bị lẫn lộn phiên bản
- Python
- shell=True cần cho
- Tuple là mảng nhưng không thay đổi được số lượng phần tử
- init() chỉ tạo giá trị cho lớp. new() mới thực sự là hàm tạo
- init.py nói cho Python biết folder chứa nó là một package
- Khác biệt giữa JS và Python
- JS uses {} syntax for object literals, Python uses it for dictionary and set literals
- Map trong JS tương đương với dictionary trong Python
- Trong JS, console.log() sẽ hiển thị toàn bộ nội dung vật thể mà không phải làm gì. Trong Python, print() sẽ chỉ hiển thị nội dung vật thể nếu str() đã được định nghĩa
- Từ điển dùng để chứa và thao tác với dữ liệu, trong khi JSON về bản chất dùng để mã hóa và giải mã dữ liệu
- Ý nghĩa tên folder
- Ở JS, nếu một biến có giá trị là một chuỗi JSON thì nó sẽ được hiểu là vật thể. Ở Python, nó được hiểu là từ điển
- JS và Python đều không yêu cầu phải khai báo kiểu ngay lúc viết
- JS được sinh ra để chạy trên trình duyệt và không được dùng để làm việc với lượng code lớn
- Python tách bạch từ điển và vật thể, còn JS không làm vậy
- Python tập trung vào việc cung cấp một ngôn ngữ lập trình tổng quát, dễ đọc và dễ viết
- Map, dictionary, associative array, hash, hash table là những cái tên cho cùng một thứ
- Nên để dư một dấu phẩy ở phần tử cuối cùng khi tạo vật thể hoặc mảng
- cargo giống npm hay pip
- Crate là file, package là tập hợp nhiều crate
- Mỗi lần refactor là một cực hình
- Nếu compiler không làm cho lập trình viên thấy rõ lỗi của họ là gì, thì đó là lỗi của Rust, không phải của họ
- Rust phù hợp khi code đã ổn định rồi
- Rust
- Viết chương trình bằng Rust giống như sống trong mối quan hệ bạo hành
- TS là để thêm kiểu vào một ngôn ngữ từ đầu đã không muốn có kiểu. Rust được sinh ra với ý định có kiểu ngay từ đầu
- Việc hiển thị nội dung dữ liệu như thế nào là do công cụ quyết định, không phải ngôn ngữ quyết định
- Ngôn ngữ scripting sinh ra là để xử lý văn bản, không nhấn mạnh về kiểu, khai báo
- Chữ ML trong HTML, XML, YAML, TOML là viết tắt của markup language
- JSON hữu ích trong việc truyền dữ liệu vì nó hướng đến việc trở thành phần giao của các ngôn ngữ, chứ không phải phần hợp của chúng
- JSON không cho phép để dư dấu phẩy, không có comment, bắt buộc phải dùng ngoặc kép, key phải được đóng trong ngoặc kép
- JSON là cách để biểu diễn vật thể ra chữ, chứ tự nó không phải là vật thể
- JSON Schema dùng để đảm bảo file JSON được viết đúng
- Ngôn ngữ đánh dấu
- Chuyển từ YAML sang JSON
- YAML thì để con người dễ đọc, còn JSON là để máy dễ đọc
- YAML được sinh ra để con người đọc và viết metadata một cách dễ dàng
-
Regex, Unicode, tiếng Việt, emoji:
- Bộ gõ tiếng Việt
- Các quy chuẩn thời gian ISO và RFC
- Các ký tự ASCII có 1 điểm mã
- Cách máy tính hiểu ký tự khác với cách con người hiểu ký tự
- Không gian mã là không gian chứa tất cả các điểm mã của Unicode
- Kể cả khi viết nội dung bằng ngôn ngữ khác thì số ký tự ASCII vẫn nhiều hơn
- Lý thuyết Unicode
- Mỗi điểm mã được biểu diễn dưới dạng U+XXYYYY
- Những số bắt đầu bằng 0x là những số hex
- Tuỳ vào phương thức mã hoá mà mỗi ký tự Unicode sẽ được biểu diễn bởi 1-4 đơn vị mã, 1-2 đơn vị mã, hoặc chỉ một đơn vị mã duy nhất
- Unicode chia thành 17 plane, mỗi plane chứa 65,536 (= 16⁴) điểm mã
- UTF là cách thức để chuyển đổi từ điểm mã sang hệ nhị phân
- Điểm mã không phải là cách để máy tính lưu ký tự
- Điểm mã liên quan đến việc con người đánh số thứ tự của ký tự thế nào. Đơn vị mã liên quan đến việc máy tính dùng phương thức nào để biết tìm ký tự đó ở đâu
- Cần escape regex
- Dùng regex.exec() với while dễ vào vòng lặp vô hạn
- Dùng regex.test(string) trực tiếp ngay trong if có thể ra sai
- regex.exec(), regex.test() thay đổi kết quả sau những lần gọi mới
- Ký tự unicode nếu dùng b ngay sau thì không được
- Lazy quantifier chỉ lười về bên phải, chứ không lười về bên trái
- Regex giúp tìm kiếm những chuỗi phức tạp
- Tiếng Việt có 2 cách đặt dấu thanh, căn cứ vào thẩm mỹ hoặc vào ngữ âm
- Tự học regex
- Under the hood, hệ điều hành và trình duyệt chỉ sử dụng đường dẫn ASCII
- Cài PangoCairo trước khi dùng unicode trong Graphviz
-
Web:
- Cache giúp giảm thời gian tải trang
- Cookie lưu thông tin cá nhân để server nhận dạng được ai với ai
- CORS là để trình duyệt bảo vệ người dùng, không phải để bảo vệ máy chủ
- Có 4 loại vật thể. Tag, NavigableString, BeautifulSoup, và Comment
- find() chỉ kiếm tag đầu tiên, find_all() mới kiếm tất cả các tag
- NavigableString là những chữ có trong tag
- Tag là từ điển
- Cào web
- Kiếm backend API trước hơn là cào bằng frontend
- Remote Control được sinh ra để giải quyết vấn đề Same-Origin Policy
- Selenium bao gồm IDE, Remote Control, WebDriver và Grid. Selenium 1 thực ra là Remote Control. Selenium 2 thực ra là Remote Control có thêm WebDriver
- Component hàm không có trạng thái (stateless). Component lớp có trạng thái (stateful)
- Component là những hàm hoặc lớp trả về một khối JSX
- Dùng fetch dạng promise chứ đừng await trong component
- Không có async component vì hiệu suất quá tệ
- JSX là cách để viết JS như thể viết HTML
- key là một thuộc tính đặc biệt của vật thể props để việc render được hiệu quả hơn
- Phải viết JSX trong .jsx hoặc .tsx
- Props giúp việc thêm property cho DOM giống như thêm attribute cho HTML
- Props là viết tắt của property, nghĩa gốc là tài sản. Tài sản của cha mẹ thì con dùng được, nhưng tài sản của con thì cha mẹ không đụng được
- Props là đối số đầu tiên của hàm component, dùng để truyền giá trị các thuộc tính của nó
- Những hàm được export default và được viết hoa ký tự đầu tiên là component
- Nếu truyền HTML làm giá trị biến thì cần dùng dangerouslySetInnerHTML, nếu không thì sẽ bị mã hoá hết
- Render là quá trình chuyển đổi dữ liệu và code sang HTML
- Framework
- form
- Fresh dùng Preact cho UI
- Fresh và Astro đều cung cấp khả năng render island lần đầu tại server và những lần sau tại client
- Fresh đối với Preact cũng giống như Next.js đối với React. React với Preact cung cấp khả năng render (làm framework), còn Fresh hay Next xử lý những thứ còn lại (làm meta-framework)
- JS là để tăng trải nghiệm người dùng. Framework là để tăng trải nghiệm lập trình viên
- Lịch sử phát triển framework JavaScript
- Next.js, Remix, Gatsby là những framework mà chính React giới thiệu là nên dùng
- Preact chỉ là một thư viện render. Nó không có biết gì về server hay routing cả
- React nên được alias thành preact-compat
- React được sinh ra để làm việc với trạng thái
- Vì Node, Deno viết trên V8 chứ không phải Gecko, nên chỉ có Chrome mới debug được chứ Firefox thì không
- Ở Preact, onInput sẽ kích hoạt ngay trong lúc nhập, còn onChange chỉ kích hoạt khi người dùng đổi focus
- Component nằm trong thư mục island sẽ được render lần đầu ở server, còn những lần sau đều ở client
- Các hàm được môi trường thực thi cung cấp không hoạt động được ở island
- Island là những component ở trong thư mục islands
- Island với partial hydration là một
- Khi một vật thể được đổ dữ liệu vào, nó được gọi là được tưới nước
- Mỗi khi state thay đổi thì islands được render lại
- State giúp cập nhật dữ liệu mà không cần tải lại trang
- Nói cho đến cùng thì trang web chỉ là form
- Chính vì setState render lại cả component, nên với những file component muốn tách ra nhiều hàm độc lập, và state
- Các hàm set của hook sẽ kích hoạt việc render lại component nơi nó được khai báo
- Cách dùng useEffect với useState
- Dùng setState gọn hơn signal nếu không phải truyền setter qua nhiều hàm khác nhau
- Không dùng mảng hoặc vật thể trong setState được
- Phải viết hook trong component. Không viết trong loop hoặc if được
- Trong useEffect chỉ dùng được promise, không dùng async được
- useEffect được sinh ra là để side effect không tự động chạy mỗi khi component được render
- createContext() nằm ngoài global, useContext() nằm trong component
- useContext() là cách để không phải dùng Consumer
- Giá trị trả về của useContext() là giá trị được truyền vào thuộc tính value của provider
- Đối số của createContext() quyết định kiểu của value của Context.Provider
- effect khác computed ở chỗ một cái có return, một cái không có return
- Signal chỉ render lại mỗi phần tử HTML chứa giá trị của nó
- Signal giúp giải quyết các vấn đề do useState hoặc Context tạo ra
- Route là code viết cho server. Island là code viết cho client
- Có một số hàm ở server sẽ không serialize được
- Khi có một yêu cầu tới một route, handler được gọi trước, sau đó tới component
- Kết quả được trả về ctx.render(arg) của handler sẽ được truyền lại vào props.data của component
- Nếu viết handler dưới dạng vật thể thì chỉ những phương thức là động từ HTTP mới được dùng. Nếu viết dưới dạng hàm thì cái hàm đó sẽ trở thành handler luôn
- Route cần có ít nhất một handler hoặc một component
- Route không bao giờ được gửi đến client. Island được chạy ở cả server và client
- Serialize là cách duy nhất để truyền dữ liệu từ server tới client và ngược lại
- So sánh Single Page App (SPA) vs Progressive Web App (PWA)
- UI là kết quả của state và data. State nằm ở client, data nằm ở server
- DOM là kết quả của việc parse HTML
- Dùng tag ngữ nghĩa thay vì dùng div
- DOM property khác HTML attribute
- HTML giống như từng thành phần trong bộ đồ như quần, áo, nón, giày. CSS giống như màu sắc, kích thước của quần, áo. JS là thứ giúp thay đổi màu sắc, kích thước của quần, áo
- Khi chỉnh CSS mà thấy không thay đổi, thử xoá cache xem
- Property nghĩa gốc là tài sản. Attribute nghĩa gốc là thêm vào
- Nếu tạo CORS proxy thì chỉ trả về đúng HTML thôi, đừng xử lý gì hết trên đó
- Render phía máy chủ nhanh và SEO tốt. Render phía người dùng phù hợp cho những ứng dụng cần tương tác nhiều
- Same-origin policy ngăn chặn việc script ở tab này điều khiển tab kia
- Github Page, Netlifier, Verxel là những
- Bất cứ một tệp nào trong overrides sẽ thay thế tệp ở theme gốc
- main.html là template
- main.html mở rộng base.html
- Plugin ezlinks vừa nhiều lỗi vừa không cần thiết
- py-obsidianmd gặp lỗi khi chuyển từ ALL sang FRONTMATTER
- Mkdocs giúp dựng một web tĩnh từ các file markdown
- Muốn cái nào làm trang chủ thì để tên là index.html
- Nội dung của một website WordPress được lưu trữ trong cơ sở dữ liệu dạng bảng
- Nội dung trong cơ sở dữ liệu được PHP hiển thị thành HTML
- PHP là một ngôn ngữ lập trình cho web
- phpMyAdmin là GUI để dùng MySQL
- WordPress là một hệ thống quản lý nội dung
- WordPress viết trên nền PHP
- WordPress.org là phần mềm mã nguồn mở. WordPress.com là dịch vụ hosting
- Web
-
Ξ Nguồn và tài nguyên hỗ trợ:
Cập nhật lần cuối :
2 tháng 7, 2024
Tạo : 17 tháng 10, 2023
Tạo : 17 tháng 10, 2023