javascript
Advanced Javascript
Advanced Javascript
  • 😆Attribute Starts With Selector [name^="value"] (ok)
  • 🥹 Tìm hiểu về Map và Set trong javascript (ok)
  • 🫢 The Array.from() method returns an array from any iterable object. (ok)
  • 😍localeCompare() method compares two strings return sort order -1, 1,0 (for before, after, or equal)
  • 😍JavaScript Array some() method returns true (and stops) if the function returns true() (ok)
  • Add key value pair to all objects in array (ok)
  • 🥸Làm một sider tuyệt đẹp "Timed-Cards-Opening"
  • 🥸Scroll animations! How to add a flowing path like the Lusion site with SVG and Javascript (ok)
  • Chia sẽ code plugin tạo thời gian chờ tải cho nút download
  • 😛jQuery 1.9 .live,.delegate,.on is not a function (ok)
  • 😁Importing CSS Breakpoints Into JavaScript (ok)
  • The matchMedia() method returns a MediaQueryList with the results from the query. (ok)
  • Collect nhiều sách pdf (ok)
  • 😁Check device Agent chrome, firefox ... (ok)
  • === START Three.js and TypeScript ===
  • Setup Development Environment (ok)
  • === END Three.js and TypeScript ===
  • === START THREE.JS ===
  • 🥳Fundamentals - three.js manual
    • Light trong Three.js
  • == Start Nguyên tắc cơ bản ===
  • Nguyên tắc cơ bản
  • Thiết kế đáp ứng
  • nguyên thủy
  • 😅Điều chỉnh camera (ok)
  • 😅Điều chỉnh scale
  • 🥲Xử lý màn hình HD-DPI
  • 😃So sánh Mesh với Object3D
  • 😅Trục AxesHelper
  • 😅Tạo GridHelper
  • 😆MeshBasic, MeshLambert, MeshPhong, MeshToon, MeshStandard, MeshPhysical, Shader, RawShader
  • == End Nguyên tắc cơ bản ===
  • 🥰Bài viết mẫu thự hành tọa độ, quay (ok)
  • Giới thiệu HTML5 Canvas
  • Bài 1: Làm quen với môi trường 3D của ThreeJS
  • Bài 2: Dịch chuyển đối tượng 3D - Controls
  • Bài 3: makeup
  • Bài 4: Models loader
  • 😁Những trang học three.js
  • Source Code Example
  • === END THREE.JS ===
  • === START WebGL ===
  • 😇Trang học WebGL && Shador
  • 😅Tìm hiểu về OpenGL ES 2.0
  • Tìm hiểu về WebGL phần 1: thư viện đồ họa web.
  • Tìm hiểu WebGL Phần 2: Đi sâu vào cách code WebGL appication
  • Tìm hiểu WebGL Phần 3: Đi sau vào cách code WebGL appication - các ví dụ
  • Tìm hiểu WebGL Phần 4: Các ví dụ.
  • === END WebGL ===
  • 😃Getting started with systemjs full (ok)
  • Đọc thêm bài này Mô-đun ECMAScript và khả năng tương thích trình duyệt (ok)
  • 😖Thư viện chặn truy cập vào Devtool (ok)
  • === START JAVASCRIPT Vanila ===
  • 😄Làm cách nào để ngăn sự kiện onclick của cha mẹ kích hoạt khi nhấp vào con parent, child ? (ok)
  • 😁Bootstrap 5 - multi item carousel (ok)
  • Three dots ( … ) in JavaScript
  • "... Three Dots" đã thay đổi javascript như thếnào ?
  • Array-like objects, Chuyển đối tượng arguments thành array (ok)
  • 😇Making a short alias for document.querySelectorAll (ok)
  • JavasScript Siblings (ok)
  • JavaScript Modules Full (ok)
  • JavaScript select Element (ok)
  • === END JAVASCRIPT Vanila ===
  • Sử dụng async, await, bất đồng bộ lấy dữ liệu Pagination, sử dụng Deferred 👌 phần 2 (ok)
  • how to use multiple ternary operator in javascript, ?:, ?? (ok)
  • 😅[DATETIMEPICKER] jQuery Plugin Date and Time Picke Full (ok)
  • === START tutorial HYPERAPP ==
  • [HYPERAPP] Hyperapp - JavaScript micro-framework chỉ 1kB (ok)
  • [HYPERAPP] hyperapp-tutorial-step-1 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-2 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-3 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-4 (ok)
  • === END tutorial HYPERAPP ==
  • Free and Open Source Web Builder Framework
  • 😁How to recursively fetch data from paginated API then combine into one array (ok)
  • 😆Create a form with dom with nested tags, Wrapping a set of DOM elements using JavaScript (ok)
  • 😇Array find, Tìm phần tử đầu tiên thỏa mãn điều kiện (ok)
  • 😁Array find, Tìm phần tử cuối cùng thỏa mãn điều kiện (ok)
  • Cách tích hợp bộ lọc select chọn nhanh Tỉnh, Thành & Quận, Huyện, districts, provinces (ok)
  • object with methods, you can simply call a method from the object returned. (ok)
  • Portfolio, Filter, Gallery, Tabmenu (ok)
  • JavaScript chạy bất đồng bộ như thế nào?, Microtask ,Macrotask, queueMicrotask bài viết hay (ok)
  • 😋Learn prototypejs 😒😒😒
  • === START JavaScript chuyên sâu ===
  • [JavaScript chuyên sâu] Higher order function trong JavaScript - phần 1 (ok)
  • [JavaScript chuyên sâu] - Higher order function - phần 2: closure, currying, callback
  • [JavaScript chuyên sâu] - So sánh Constructor Function và Factory Function
  • [JavaScript chuyên sâu] - 5 vai trò của Function: function, object, property, callback, constructor
  • [JavaScript chuyên sâu] : Đồng bộ và bất đồng bộ của JavaScript - phần 1: Callback
  • [JavaScript chuyên sâu]: Từ hàm IIFE tới Module Pattern
    • 😍IIFE=>Immediately Invoked Function Expression=>khởi tạo function & chạy ngay, import, export như nào
  • Tìm hiểu về Higher-Order Functions trong JavaScript
  • === END JavaScript chuyên sâu ===
  • QR-Card (ok)
  • === START DATATABLE ===
  • [DATATABLE] bộ lọc sử dụng các thẻ bên trong td matter.vn (ok)
  • 😁[DATATABLE] JQuery Datatables Editor - Alternative to the official one (ok)
  • Example: Datatables Add Edit Delete with Ajax, PHP & MySQL (ok)
  • [DATATABLE] fixedColumns, DataTable, Left and right fixed columns (ok)
  • [DATATABLE] Sử dụng thư viện dataTables.bootstrap.min.js && dataTables.bootstrap.min.js (ok)
  • [DATATABLE] DataTables.net with DataTableQueryBuilder sample input filter (ok)
  • [DATATABLE] How to use Tabledit plugin with jQuery Datatable in PHP Ajax (ok)
  • [DATATABLE] DataTables Custom Filter Demo (ok)
  • [DATATABLE] Datatable multiple checkbox demo (ok)
  • [DATATABLE] HTML5 export buttons (ok)
  • [DATATABLE] CodePen Home DataTable 2 Card view (ok)
  • [DATATABLE] DataTables - Column Search (ok)
  • [DATATABLE] CodePen Home dataTables conditional row and cell styling (ok)
  • [DATATABLE] DataTables example of styling Excel export(ok)
  • === END DATATABLE ===
  • 😅Bất ngờ về sử dụng Window History full 1 (ok)
  • 😁Bất ngờ về sử dụng Window History full 2, window.history.scrollRestoration,history.replaceState(ok)
  • workingHoursBetweenTimes, tính giờ làm việc, giờ làm thêm (ok)
  • 😅addDataToArray, cộng mảng đối tượng với điều kiện key == (ok)
  • You can get the number of days in a specified month (ok)
  • Lấy giá trị khác nhau đầu tiên, cuối trong một mảng Object (ok)
  • swiperjs.com (ok)
    • Swiper Slider (ok)
  • Một số cách viết ngắn gọn code trong JS phần 1 (ok)
  • Một số cách viết ngắn gọn code trong JS phần 2 (ok)
  • literal javascript, php (ok)
  • Bài toán kinh điển sử dụng three dots lấy tất cả các key của object, key same, plus (ok)
  • convert object to array javascript (ok)
  • ==== Start Google Sheet ====
  • Kintone width Appscript (ok)
  • [GOOGLE-SHEETS] Buttons in Google Sheets
  • [GOOGLE-SHEETS] thực hiện chuyển dữ liệu sang bản khác (ok)
  • [GOOGLE-SHEETS] method getRange (ok)
  • [GOOGLE-SHEETS] method getRange (ok)
  • Bài 1: Khai Báo Biến và Đọc Ghi Ô – Dải Ô (Cell / Range)
  • Bài 2: Các Hàm Lấy Giá Trị và Đặt Giá Trị Dải Ô getRange – getValues – setValues
  • Bài 3: Copy và Di Chuyển Dải Ô Sang Sheet khác
  • Bài 4: Vòng Lặp For
  • Bài 5: Di chuyển dòng từ Sheet này sang Sheet khác
  • [Help] – Chuyển Cột Sang Hàng (bỏ ô trống) (ok)
  • Bài 6: Câu lệnh điều kiện IF (ok)
  • Bài 7: Giới thiệu các Trigger App Script – onEdit onOpen
  • [Help] – Form nhập liệu đơn giản
  • Bài 8: Hộp thoại Dialog / Popup
  • Bài 9: Ghi công thức Google Sheet vào ô
  • Bài 10: Đọc Ghi Mảng (Array) App Script
  • Bài 11: Tạo xác thực dữ liệu phụ thuộc
  • Lấy Email người dùng đang hoạt động trên Google Sheet – getActiveUser
  • Bài 12: Liên kết Google Form – Sheet – Apps Script
  • [Series Email] Bài 1: Gửi Email bằng Apps Script cơ bản
  • [Series Email] Bài 2: Gửi Email Đính Kèm File – Hình Ảnh
  • [Series Email] Bài 3: Gửi Email Cho Danh Sách Nhập Vào Từ Google Sheet
  • Addon Email All in One | Email AI1 | RA MẮT BẢN THỬ NGHIỆM
  • [Series Email] Bài 4: Gửi Email Bcc Cho Danh Sách Nhập Vào Từ Google Sheet
  • [Series Email] Bài 5: Tạo Hộp Thoại Xem Email Trước Khi Gửi
  • [Series Email] Bài 6: Gửi Email Theo Template Cho Sẵn
  • [Series Email] Bài 7: Gửi Email Xác Nhận Điền Form (Email Confirmation)
  • [Series Email] Bài 8: Hẹn Giờ Gửi Email
  • SpreadsheetApp
  • Giới hạn các Service trong Apps Script
  • [CF] Lọc dải ô bao gồm dải ô khác
  • Cách lưu trữ trong Google Apps Script – PropertiesService
  • [CF] Custom Function Google Sheets là gì và Cách ‘cài đặt’
  • [CF] Tìm Ô – Có Giá Trị – Cuối Cùng Trong Cột – Google Sheets
  • [CF] Đếm số lần xuất hiện kí tự trong dải ô Google Sheets
  • [CF] Lọc dải ô không bao gồm
  • ==== End Google Sheet ====
  • [REDUCE] JavaScript Array reduce()
  • Merge object and split array by size, Trộn object và tách array theo size (ok)
  • Đặt điều kiện mới load js (ok)
  • Calculate working days between two dates in Javascript excepts holidays (ok)
  • Remove everything after a certain character remove replace (ok)
  • CodePen Home Image zoom on hover - auto run - view full (ok)
  • ======== Start Slider Revolution =======
  • How to start (ok)
  • Revolution Lightbox tham khảo
  • Mẫu và thực viện để thực hành (ok)
  • Tài liệu Slider Revolution Jquery 2.0 (ok)
  • Tài liệu Slider Revolution Jquery 4.1.2 (ok)
  • ======== End Slider Revolution =======
  • jQuery click / toggle between two functions (ok)
  • [TEXT ANIMATION] làm hiệu ứng chữ dòng trên xuất hiện trước rồi mới đến dòng dưới (ok)
  • Phát hiện phần tử xuất hiện ở màn hình, Detect element appearing on screen, view (ok)
  • what does !function in Javascript mean? (ok)
  • [WEBPACK] Một cách phân biệt khi bundle ra es5 hay es6 một ví dụ sử dụng webpack (ok)
  • Javascript Self Invoking Functions (ok)
  • ====== Start Convert ES5 class to ES6 class ====
  • VS Code tips: Convert ES5 class to ES6 class code action (ok)
  • ====== End Convert ES5 class to ES6 class ====
  • Get Substring between two characters using javascript (ok)
  • add Html Table rows data into JSON array Object (ok)
  • lightGallery, lightgalleryjs, Lightbox (ok)
  • same height (ok)
  • Hình ảnh :(
  • ============ Start serialize =============
  • jQuery serialize() Method (ok)
  • serialize width php mysql (ok)
  • serialize, serializeObject, serializeArray (ok)
  • How to access jQuery serialized data? (ok)
  • ============ End serialize =============
  • Sử dụng addQueryVar để thêm vào đường dẫn ajax (ok)
  • Cách tích hợp captcha style2.track360.xyz (ok)
  • Simple JavaScript Captcha Example (Client Side Captcha)
  • 😍Đoạn mã sử dụng translate.google.com (ok)
  • ========== Start [MultiLang] ===========
  • [MultiLang] MultiLang.js (ok)
  • [MultiLang] Localizing JavaScript apps with jQuery.i18n (ok) (full)
  • [MultiLang] jQuery i18n những điều nên biết (ok)
  • [MultiLang] How to Create a Multilingual Application using JavaScript
  • [MultiLang] Build multiple language website using jQuery and JSON based methods (ok)
  • [MultiLang] Switch Different Languages On The Webpage - jQuery multilang (ok)
  • [MultiLang] jquery-multilang (ok)
  • ========== End [MultiLang] ===========
  • [MINICOLORS] jquery.minicolors (ok)
  • jQuery - addClass ACTIVE--> set timeout --> cycle (ok)(online.vinmec.com)
  • WP Mapbox GL JS Settings key (ok)
  • Xử lý ảnh thiếu thuộc tính title, alt trên style2.track360.xyz (ok)
  • Register your schema (ok)
  • ========= Start Learn Graphql Website =======
  • 1. Query and Mutation types
  • ========= End Learn Graphql Website =======
  • [GRAPHQL] Tạo Database với Mysql (ok)
  • KẾT NỐI VỚI MYSQL – NODEJS – 05
  • 😍Quick start graphql (ok)
  • Hướng dẫn bắt đầu GraphQL với Node.js (Phần 1)
  • Hướng dẫn bắt đầu GraphQL với Node.js (Phần 2)
  • Cách bắt đầu với ứng dụng GraphQL, React, Apollo Client và Apollo Server
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 1 (Application Introduction
  • 😍[Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 2 (Backend - Project Setup a
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 3 (Backend - Simple Mutation
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 4 (Backend - Connect to Data
  • 😍Prisma Crud Full
    • 🥰Sử dụng kết hợp prisma.io với wordpress như nào?
    • [ERROR] gặp lỗi TypeError: Do not know how to serialize a BigInt (ok)
    • 😍Migrate MongoDB to MySQL using Prism Key Differences (ok)
  • Setting Up Prisma with MySQL: A Step-by-Step Guid
  • Tìm hiểu GraphQL, Xây dựng 1 GraphQL server với prisma
  • 🥹Đã có bài viết về sqlite, sqlite3 đầy đủ (ok)
  • 😍Querying Sequelize Full link sequelize.org (ok)
  • 😁Sqlite Sequelize Example (ok)
  • 😍CRUD with React and GraphQL Mysql (ok)
  • 😍A GraphQL Sqlite, sequelize Full (ok)
  • GraphQL in practice - Part 1: Xây dựng GraphQL server với Apollo Server, ExpressJS và MongoDB
  • GraphQL in practice - Part 2: Tạo ứng dụng GraphQL với Apollo Client và React
  • GraphQL in practice - Part 2: Tạo ứng dụng GraphQL với Apollo Client và React
  • TÌm hiểu về GraphQL
  • Cùng tìm hiểu về GraphQL
  • Simple Guidance For You In GraphQL
  • [GRAPHQL] Get started with Apollo Server (ok)
  • [GRAPHQL] Schema basics (ok)
  • [GRAPHQL] Subscriptions (ok)
  • [GRAPHQL] Unions and interfaces (ok)
  • Tham khảo: https://www.howtographql.com
  • Tìm hiểu GraphQL: Các khái niệm cơ bản (ok)
  • GraphQL Và Ưu Điểm Nổi Bật So Với Rest API?
  • Xây dựng server GraphQL với NodeJS (ok)
  • Tìm hiểu GraphQL
  • Xây dựng GraphQL server với Node.js
  • Ví dụ Tạo Restfull API - CRUD đơn giản với NodeJS, GraphQL (ok)
  • Sequelize with Node, Express & Mysql and it’s setup (ok)
  • Sequelize in Nodejs Part I
  • Sequelize in Nodejs Part II
  • Videos NodeJS + MySQL Database
  • NodeJS – Lưu trữ dữ liệu trên MySQL với Sequelize
  • Exploring The Node.js With MySQL Example Using Sequelize & Express
  • Tạo model, migration, seeds với Sequelize
  • Sử dụng passport với sequelize và MySQL
  • Tạo model, migration, seeds với Sequelize
  • GraphQL là gì? Bắt đầu với GraphQL
  • Xây dựng API sử dụng Laravel và GraphQL
  • How To Connect To MySql Database Using Sequlize In Express (Node) Application
  • Node.js MySQL Tutorial
  • Node.js Rest APIs example with Express, Sequelize & MySQL
  • Getting Started with Node, Express and Mysql Using Sequelize
  • [GRAPHQL] GraphQL – Công nghệ mới cho web developer
  • GraphQL là gì? Tìm hiểu về GraphQL (ok)
  • [GRAPHQL] Cùng tìm hiểu về GraphQL
  • Điều gì ẩn chứa bên trong $.event???
  • ===== Start Put JavaScript Design Patterns Into Practice (Videos) ========
  • 2.1. The Factory Pattern (ok)
  • 3.1. The Publisher-Subscriber Pattern (ok)
  • 3.2. The Strategy Pattern (ok)
  • Rời phần thử khỏi mảng sử dụng filter (ok)
  • 3.3. The Observer Pattern (ok)
  • 3.4. The Chain of Responsibility Pattern (ok)
  • 3.5. The Mediator Pattern (ok)
  • 3.6. The Iterator Pattern (ok)
  • ===== End Put JavaScript Design Patterns Into Practice (Videos) ========
  • ========== Start RequireJS Tutorial =======
    • Sử dụng RequireJS và AMD để module hóa code JavaScript (ok)
  • 😍Trình duyệt không có require, nhưng Node.js thì có. Với Browserify để trình duyệt cũng có (ok)
  • Sử dụng Bower để quản lý các thư viện code trong Laravel (ok)
  • RequireJS - Environment Setup (ok)
  • RequireJS - Configuration (ok)
  • RequireJS - AMD Modules (ok)
  • RequireJS - Defining Function (cách sử dụng require rất lạ) (ok)
  • RequireJS - Optimizer (ok)
  • ========== End RequireJS Tutorial =======
  • ========== Start jQuery Ui ======
  • Jquery Datepicker select multiple date ranges in one calender, button Reset (ok)
  • Tạo chức năng tự động hoàn tất nhập liệu với thư viện jQuery UI Autocomplete (Phần 1) (ok)
  • Draggable Widget, Droppable Widget (ok)
  • jQuery drag and drop (kéo thả bằng jQuery)
  • jQuery drag full (ok)
  • jQuery drop full (ok)
  • jQuery Resizable full (ok)
  • Tablesorter full (ok)
  • Live search through table rows (ok)
  • Loại bỏ một số cột không tìm kiếm trong Tablesorter (ok)
  • jQuery Sortable full, tablesorter (ok)
  • jQuery Selectable full (ok)
  • jQuery UI Sortable Tutorial - Save Positions With Ajax & PHP & MySQL (ok)
  • jQuery Drag and Drop TODO List with PHP MySQL (ok)
  • ========== End jQuery Ui ======
  • [TUTORIAL] TRÍCH XUẤT THÔNG TIN TỪ WEBSITE VỚI HTML AGLITITY PACK
  • ======== Start handlebars js =======
  • Sử dụng handlebars js
  • Handlebars nhỏ nhưng có võ
  • ======== End handlebars js =======
  • ==== Start JavaScript Tutorial ====
  • JavaScript Introduction
  • What is JavaScript
  • JavaScript Essentials
  • JavaScript Variables
  • JavaScript Operators
  • JavaScript Conditionals
  • JavaScript Loops
  • JavaScript Built-in Types
  • JavaScript Objects
  • JS Advanced Objects
  • JavaScript Arrays
  • JavaScript Functions
  • JavaScript Function Objects
  • JavaScript JSON
  • JavaScript Regular Expressions
  • Bôi màu cho một ký tự đặc biệt và chuỗi @EsportsArcadia Regular Expression (ok)
  • JavaScript Reference
  • ==== End JavaScript Tutorial ====
  • 🧐===== Start JavaScript Design Patterns ==
  • JavaScript Design Patterns
  • JavaScript Design Patterns – Explained with Examples
  • Js design pattern doFactory master (ok)
  • Chapter 5: jQuery Patterns
  • JavaScript Design Patterns (ok)
  • Abstract Factory (ok)
  • Builder (ok)
  • Factory Method (ok)
  • Prototype (ok)
  • Singleton (ok)
  • Adapter ( ok)
  • Bridge (ok)
  • Composite (ok)
  • Decorator (ok)
  • Facade (ok)
  • Flyweight (ok)
  • Proxy (ok)
  • Chain of Responsibility (ok)
  • Command (ok)
  • Interpreter (ok)
  • Iterator (ok)
  • Mediator (ok)
  • Memento (ok)
  • Observer (ok)
  • State (ok)
  • Strategy (ok)
  • Template Method (ok)
  • Visitor (ok)
  • ===== End JavaScript Design Patterns ==
  • ======== Start Backbone.js Tutorial Videos ======
  • Backbone.js Tutorial - 1 - Installation.mp4 (ok)
  • Backbone.js Tutorial - 2 - Introduction to Models (ok)
  • Backbone.js Tutorial - 3 - Model Attributes (ok)
  • Backbone.js Tutorial - 4 - Model Change Events ( ok)
  • Backbone.js Tutorial - 6 - Introduction to Views (ok)
  • Backbone.js Tutorial - 7 - (Views) Differerence between el and $el (ok)
  • Backbone.js Tutorial - 8 - (Views) Creating New HTML Elements (ok)
  • Backbone.js Tutorial - 9 - (Views) Using the Render Function (ok)
  • Backbone.js Tutorial - 10 - (Views) Events (ok)
  • Backbone.js Tutorial - 11 - Introduction to Collections (ok)
  • Backbone.js Tutorial - 12 - (Collections) Adding and Removing Elements (ok)
  • Backbone.js Tutorial - 13 - (Collections) Modifying Elements
  • Backbone.js Tutorial - 14 - (Collections) Events (ok)
  • ======== End Backbone.js Tutorial Videos ======
  • ====== Start Learn backbone.js tutorial from scratch for beginners =====
  • Backbone :)
  • 1. Learn backbone.js tutorial from scratch(Part 2) Features and Working Principle of backbone.js
  • 2. Learn backbone.js tutorial from scratch for beginners(Part 4) About el and $el in Backbone.js
  • 3. Learn backbone.js tutorial from scratch for beginners(Part 5) Underscore Templates in Backbone.js
  • 4. Learn backbone.js tutorial from scratch for beginners (Part 7) Delegate Events in backbone.js
  • 5. Learn backbone.js tutorial from scratch for beginners(Part 8) Introduction of models in backbone.
  • 6. Learn backbone.js tutorial from scratch for beginners(Part 9) Pass Model data to backbone.js View
  • 7. Learn backbone.js tutorial from scratch for beginners(Part 10) Model data to underscore.js templ
  • 8. Learn backbone.js tutorial from scratch for beginners(Part 11) Head back to underscore.js symbol
  • 9. Learn backbone.js tutorial from scratch for beginners(Part 12) Model Events in backbone.js
  • 10. Learn backbone.js tutorial from scratch for beginners(Part 13) Model Validation in backbone.js
  • 11. Learn backbone.js tutorial from scratch for beginners(Part 14) Model Change Events in backbone.j
  • 12. Learn backbone.js tutorial from scratch for beginners(Part 15) More Model Events and listenTo ev
  • 13. Learn backbone.js tutorial from scratch for beginners(Part 16) Model Inheritance in backbone.js
  • 14. Learn backbone.js tutorial from scratch for beginners(Part 17) Collection in backbone js
  • 15. Learn backbone.js tutorial from scratch for beginners(Part 18) Collection Events in backbone.js
  • 16. Learn backbone.js tutorial from scratch for beginners(Part 19) Collection to underscore.js templ
  • 17. Learn backbone.js tutorial from scratch for beginners(Part 20) Underscore js Methods in backbone
  • 18. Learn backbone.js tutorial from scratch for beginners(Part 21) Routing in backbone.js
  • 19. Learn backbone.js tutorial from scratch for beginners(Part 22) Parameterized Routing in backbone
  • 20. Learn backbone.js tutorial from scratch for beginners(Part 23) Handlebars templates in backb
  • ====== End Learn backbone.js tutorial from scratch for beginners =====
  • Giới thiệu Backbone.js (ok)
  • Backbone.localStorage thay thế Backbone.sync lưu vào window.localStorage thay vì vào máy chủ (ok)
  • Một ví dụ full LocalStorage với BackBoneJS (ok)
  • ========== Start Backbonejs Php Mysql =============
  • Full code backbonejs php mysql (ok)
  • Giao diện html để thực hành từ đầu (ok)
  • Xây dựng giao diện (ok)
  • Thực hiện chức năng crud add (ok)
  • Phân tích để tạo giao diên http://localhost/gulp/#crud/new 1.0
  • Phân tích để tạo giao diên http://localhost/gulp/#crud/new 1.1
  • Phân tích để tạo giao diên http://localhost/create/#crud/index 2.0
  • Chức năng thêm dữ liệu http://localhost/create/#crud/new (ok)
  • Lấy dữ liệu ra trang http://localhost/create/#crud/index (ok)
  • Chức năng cập nhật dữ liệu http://localhost/create/#crud/1/edit (ok)
  • ========== End Backbonejs Php Mysql =============
  • JQuery-Template (ok)
  • Learning JavaScript Design Patterns P.1 (ok)
  • Learning JavaScript Design Patterns P.2 (ok)
  • Learning JavaScript Design Patterns P.3 (ok)
  • Singleton design pattern PHP (ok)
  • Singleton Pattern javascript (ok)
  • Factory Pattern (ok)
  • Decorator Pattern (ok)
  • Creational Pattern (ok)
  • Constructor Pattern (ok)
  • Singleton Pattern (ok)
  • Module Pattern (ok)
  • Factory pattern (ok)
  • Built-in Object Factory (ok)
  • Iterator (ok)
  • Bridge Pattern (ok)
  • Composite Pattern (ok)
  • Một số Design Patterns có thể sử dụng trong Javascript – Phần 1 (ok)
  • Chém gió về JavaScript Design Pattern - Part 1(ok)
  • Chém Gió Về JavaScript Design Pattern Phần 2
  • Chém gió về JavaScript Design Pattern - Part 3
  • 4 Design Patterns trong Javascript mà bạn nên biết
  • Design Pattern trong JavaScript (ok)
  • Lebab chuyển mã ES5 của bạn thành ES6 / ES7. Nó hoàn toàn ngược lại với những gì Babel làm (ok)
  • Turn your ES5 code into readable ES6 (ok)
  • Thuộc tính :selected quá tuyệt cho sự lựa chọn (ok)
  • jQuery I want to add an active class to the linked ID of an anchor tag style2.track360.xyz (ok)
  • Keep URL unaffected when anchor link is clicked (ok)
  • [UI SLIDER] Ui slider with text box input (ok)
  • [SELECT2] version Select2 3.5.3 nhìn trực quan hơn (ok)
  • [SELECT2] keypress select2, enter key press keycode yp.vn (ok)
  • [SELECT2] Select2 Bootstrap Theme (ok)
  • [SELECT2] tags (ok)
  • [SELECT2] tokenSeparators (ok)
  • [SELECT2] click change value (ok)
  • [SELECT2] jQuery $.ajax options (ok)
  • [SELECT2] Full Options (ok)
  • [SELECT2] value placeholder (ok)
  • [SELECT2] Can thiệp vào templateResult (ok)
  • [SELECT2] làm lá cờ gắn trước text kiểu kool ngầu (ok)
  • [SELECT2] cam thiệp vào templateSelection (ok)
  • [SELECT2] thêm thẻ bọc vào lựa chọn ví dụ thẻ <strong/> (ok)
  • [SELECT2] opening when a result is selected (ok)
  • [SELECT2] Full Adapters hay (ok)
  • [SELECT2] Kiểu dữ liệu trả về cho giao diện dùng html & json (ok)
  • [SELECT2] sử dụng ngôn ngữ, i18n, language (ok)
  • [SELECT2] dropdownParent (ok)
  • [SELECT2] Hiểu submit trong javascript và nâng cấp sử dụng select 2, autocomplate (ok)
  • [SELECT2] Common problems Select2 does not function properly when I use it inside a Bootstrap modal
  • [SELECT2] Full Events (ok)
  • [SELECT2] lấy dữ liệu của wp, wordpress để thực hành (ok)
  • [JSONPLACEHOLDER SELECT2] Full Sử dụng website jsonplaceholder.typicode.com để thực hành (ok)
  • Sử dụng fetch trên console.log để get api test (ok)
  • jQuery.naturalWidth / jQuery.naturalHeight images natural Width Height Native Width (ok)
  • [SUBMIT ] form submit jquery (ok)
  • Tạo file package.json bằng lệnh (ok)
  • [TYPESCRIPT] tạo file tsconfig.json bằng lệnh (ok)
  • [TYPESCRIPT] cài đặt package chạy trực tiếp ts, tsx, ts-node (ok)
  • Object for Three Dots, Array for Three Dots (ok)
  • Cách giải thích Private Constructors & Singletons quá tuyệt (ok)
  • [TYPESCRIPT] Một số scripts hay được sử dụng trong typescripts (ok)
  • [TYPESCRIPT] A practical guide to TypeScript decorators exmaple (ok)
  • Object.getOwnPropertyDescriptor() (ok)
  • JavaScript — Property Descriptor && PropertyDescriptor (ok)
  • [TYPESCRIPT] Employing “Namespaces” in TypeScript to encapsulate your data
  • 😅[TYPESCRIPT] Một ví dụ sử dụng TypeScript Namespaces, xuất file use on browser (ok)
  • [NODEJS] object hóa một file trong javascript Nodejs - require, exports and module.exports
  • [TYPECRIPT] Omit type when extending an interface Cách loại trừ các thuộc tính khỏi giao diện (ok)
  • How TO - List Grid View (ok)
  • Javascript module, import, export, dễ ẹc, nhưng có thể bạn vẫn chưa biết
  • [BABEL] Giải thích gói babel (ok)
  • Cấu hình Webpack và Babel 7 cho React (ok)
  • ----------------- Start Kế thừa Prototype ngang và dọc -------------------
  • Kế thừa Prototype ngang và dọc
  • class, super, constructor (ok)
  • Kế thừa ngang giữa function (ok)
  • Ví dụ về kế thừa prototype ngang theo function constructor. Liên quan đến hàm call(), sẽ có bài chi
  • Kế thừa ngang giữa 2 object
  • Muốn tạo một class, object có tên k hác khi console.log?? (ok)
  • Ví dụ về Function constructor và object instance (ok)
  • Tất cả đều từ Function
  • ----------------- End Kế thừa Prototype ngang và dọc -----------
  • Easy Responsive Tabs to Accordion (ok)Demos
  • [ERROR] unable to read package/javascript (ok)
  • ------------Start Json-----------------
  • Cách để truyền dữ liệu dạng boolean trong Postman (ok)
  • ------------ End Json-----------------
  • ---------- start JSONP ---------------------
  • Cross-Domain Ajax Requests
  • 1. JSONP (JSON with padding)
  • 2. CORSCross-origin resource sharing (CORS) là một cơ chế đặc biệt cho phép resource đặt tại một do
  • 3. Proxy
  • JSONP là gì và tại sao nó được tạo ra? (ok)
  • 4. Javascript – Tạo script động và kĩ thuật JSONP (ok)
  • ----------- End JSONP --------------
  • Destructuring Assignment in ES6
  • Cơ chế bất đồng bộ trong javascript (ok)
  • jQuery.inArray()
  • website check call stack (ok)
  • Bài 6: Template Literals trong ES6 (ok)
  • ES6 Arrow Functions (ok)
  • Lập trình TypeScript (ok)
  • Uncaught ReferenceError: exports is not defined in filed generated by Typescript (ok)
  • Cách hoạt động của các module loader? (ok) một ví dụ kinh điển :)
  • RequireJS Cho Người Mới Bắt Đầu (ok) quá tuyệt
  • Tiny loaders tương tự REQUIREJS (Ok)
  • Javascript Module Loader – From the basic (ok)
  • ES6 Modules and CommonJS (Oke) Một ví dụ quý hơn vàng :(((
  • CommonJS là một module pattern hỗ trợ cho tất cả các phiên bản Node.js. Với CommonJS, JavaScript obj
  • ------------------------Start webpack ----------------------
  • [WEBPACK] Làm một ví dụ compile scss, sass bằng WEBPACK full (ok)
  • Webpack từ A đến Á: Webpack watch mode (ok)
  • Webpack từ A đến Á: Webpack dev server (ok)
  • Webpack từ A đến Á: Webpack output hash digest (ok)
  • Webpack từ A đến Á: Webpack multiple entry points (ok)
  • Webpack từ A đến Á: Webpack multiple file types per entry (ok)
  • Webpack từ A đến Á: Webpack import export module (ok)
  • Webpack từ A đến Á: Webpack source map (ok)
  • Webpack từ A đến Á: Webpack import jQuery (ok)
  • Webpack từ A đến Á: Webpack import jQuery - Bootstrap (ok)
  • Webpack từ A đến Á: Webpack import jQuery - Materialize
  • Webpack từ A đến Á: Code Splitting (ok)
  • Webpack từ A đến Á: Code Splitting (ok)
  • Webpack từ A đến Á: Webpack resolve alias - extensions
  • Config alias chuẩn trong webpack (ok)
  • Webpack từ A đến Á: Webpack Babel Loader (ok)
  • Webpack từ A đến Á: Webpack Eslint Loader (ok)
  • Webpack từ A đến Á: Webpack Url Loader (ok)
  • Webpack từ A đến Á: Webpack File Loader (ok)
  • Webpack từ A đến Á: Webpack Style Loader (ok)
  • Webpack từ A đến Á: Webpack Sass Loader (ok)
  • Webpack từ A đến Á: Html Webpack Plugin (ok)
  • Option chunks Html Webpack Plugin (ok)
  • Webpack từ A đến Á: Clean Webpack Plugin (ok)
  • What is the difference between @babel/core and babel-core? (ok)
  • [WEBPACK] 2. Webpack : Khởi Tạo Project (nghiepuit)
  • [WEBPACK] 3. Webpack : Apply Babel Cho Project (nghiepuit)
  • [WEBPACK] 4. Webpack : CSS Loader (nghiepuit)
  • plugin @babel/plugin-proposal-class-properties
  • [WEBPACK] 5. Webpack : Tạo Project ReactJS (
  • [WEBPACK] 7. Webpack : File Loader - Tích Hợp Bootstrap
  • [WEBPACK] 8. Webpack : Tích Hợp Jquery, React, Redux Devtools (nghiepuit)
  • [WEBPACK] 9. Webpack : Vendor Caching
  • [WEBPACK] 10. Webpack : CommonsChunkPlugin
  • [WEBPACK] 10. Webpack : CommonsChunkPlugin (ok)
  • [WEBPACK] Webpack series (ep3) - code splitting - chia code trong webpack (ok)
  • Compile SASS with Webpack into a CSS file (ok)
  • [WEBPACK] 11. Webpack : Optimize Khi Bundle template (ok)
  • [WEBPACK] 12. Webpack : Clean Project (ok)
  • [WEBPACK] 12+. Webpack : webpack-dev-server
  • [WEBPACK] Plugin HtmlWebpackPlugin (ok)
  • HashRouter vs BrowserRouter
  • [WEBPACK] Webpack giúp kết nối các module lại với nhau ( (ok)
  • [WEBPACK] Chú ý: @babel/preset-env dùng cho những gói cũ thay vì khai báo mới babel-preset-env (ok)
  • [WEBPACK]
  • [WEBPACK] webpack-dev-server (ok)
  • [WEBPACK] liên kết với trang Webpack (ok)
  • [WEBPACK] Webpack output hash digest (ok)
  • [WEBPACK] Webpack multiple file types per entry
  • [WEBPACK] Webpack import export module (ok)
  • [WEBPACK] Webpack source map (ok)
  • Simple use jQuery with TypeScript (ok)
  • [WEBPACK] Webpack import jQuery (ok)
  • [WEBPACK] Webpack import jQuery - Bootstrap (ok)
  • [WEBPACK] Webpack import jQuery - Materialize
  • [WEBPACK] Webpack từ A đến Á: Code Splitting
  • [WEBPACK] Webpack từ A đến Á: Webpack resolve alias - extensions
  • [WEBPACK] Config alias chuẩn trong webpack
  • [WEBPACK] Webpack từ A đến Á: Webpack Babel Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Eslint Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Url Loader (ok)
  • [WEBPACK] Webpack từ A đến Á: Webpack File Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Style Loader (ok)
  • [WEBPACK] Webpack từ A đến Á: Webpack Css Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Sass Loader
  • [WEBPACK] [SPITEST] Teach you how to use webpack to generate css sprites
  • Page learn webpack good
  • Remove unused CSS styles from Bootstrap using PurgeCSS (ok)
  • [WEBPACK] Webpack cho người mới bắt đầu (ok)
  • [WEBPACK] cấu hình output (ok)
  • [WEBPACK] Dùng webpack để sử dụng từ khóa import, export (ok)
  • [WEBPACK] Từ cơ bản đến nâng cao
  • [WEBPACK] Tăng Tốc Độ và Tối Ưu Hoá Website Bằng CSS Sprites (ok)
  • ------------------------ End webpack ----------------------
  • How to convert unordered list into nicely styled <select> dropdown using jquery? (ok)
  • 😆Lazy loading images using event handlers 1
  • 😄Layload ajax && background 2
  • jQuery Lazy 3
  • jQuery lazyload 4
  • Config lazySizesConfig lazysizes.min.js lazysizes(ok)
  • Lazy loading images using event handlers (ok)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 1)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 2)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 3)
  • Native lazy-loading for the web (ok)
  • Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img (ok)
  • Thực hành lazysizes.min.js
  • Check image img exits vieclam123.vn (ok)
  • Nestable - Drag & drop hierarchical list with mouse and touch compatibility (ok)
  • Cấu hình tawk chat web500.vn ( ok)
  • Cùng tìm hiểu plugin Jquery Validation
  • Tìm hiểu về Jquery Validation (Phần 1) (ok)
  • Tìm hiểu về Jquery Validation (Phần 2) (ok)
  • Tìm hiểu về hộp thoại Sweet alert 2
  • Multi-table,Multi table (ok)
  • SweetAlert2 getHtmlContainer (ok)
  • AJAX request preConfirm (ok)
  • sử dụng php kết hợp Sweetalert2 (ok)
  • Một ví dụ tuyệt vời Ajax SweetAlert for Live Data Deleting Rows in with PHP~MySQL~Ajax (ok)
  • SweetAlert makes popup messages easy and pretty (page learn) (kiể cũ)
  • sweetalert bản chuẩn (ok)
  • AJAX requests (ok)
  • sweetalert2 bản chuẩn (ok) cái này dùng hay hơn sweetalert (ok)
  • Toast (ok)
  • Email (ok)
  • jQuery trigger() Method
  • jQuery one() Method (ok)
Powered by GitBook
On this page
  • Cách viết truyền thống :P
  • Cách viết sử dụng RequireJS
  • RequireJS Cho Người Mới Bắt Đầu
  • Giới thiệu
  • Tiền đề bài viết
  • Đối tượng hướng đến
  • RequireJS là gì?
  • Tại sao phải sử dụng RequireJS?
  • Cách module hóa sử dụng RequireJS
  • Kiến thức về RequireJS
  • Sử dụng require() và define()
  • Các keyword hữu ích
  • Kết luận

Was this helpful?

RequireJS Cho Người Mới Bắt Đầu (ok) quá tuyệt

https://www.stdio.vn/articles/requirejs-cho-nguoi-moi-bat-dau-619

PreviousCách hoạt động của các module loader? (ok) một ví dụ kinh điển :)NextTiny loaders tương tự REQUIREJS (Ok)

Last updated 5 years ago

Was this helpful?

Một số ví dụ sử dụng trong bài :))

Cách viết truyền thống :P

index.html

<!DOCTYPE html>
<head>
  <link rel="stylesheet" href="assets/css/bootstrap.css">
</head>
<body>
  <div class="container">
    <h1> Tradition Sample Page: on hover show tooltip button </h1>
    <button class="btn btn-default" data-toggle="tooltip" title="Tooltip on top">Hover me</button>
  </div>
  <script src="assets/js/libs/jquery.js"></script>
  <script src="assets/js/libs/bootstrap.js"></script>
  <script src="assets/js/components/tooltip-button.js"></script>
  <script src="assets/js/main.js"></script>
</body>
</html>

tooltip-button.js

function button() {
  return {
    tooltipFunc: function() {
      $('[data-toggle="tooltip"]').tooltip()
    }
  }
}

main.js

// gọi hàm thực thi tooltip
var b = button();
b.tooltipFunc();

Và thứ tự goi file phải theo đúng thứ tự và hơn nữa điều này nếu đặt ở head hoặc trước </body> thì trang nào nó cũng load hết tất cả các file mặc dầu nó không sử dụng :)))

<script src="assets/js/libs/jquery.js"></script>
<script src="assets/js/libs/bootstrap.js"></script>
<script src="assets/js/components/tooltip-button.js"></script>
<script src="assets/js/main.js"></script>

Cách viết sử dụng RequireJS

index.html

<!DOCTYPE html>
<head>
  <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
</head>
<body>
  <div class="container">
    <h1> Tradition Sample Page: on hover show tooltip button </h1>
    <button class="btn btn-default" data-toggle="tooltip" title="Tooltip on top">Hover me</button>
  </div>
</body>
</html>

main.js

function loadCss(url) {
    var link = document.createElement("link");
    link.type = "text/css";
    link.rel = "stylesheet";
    link.href = url;
    document.getElementsByTagName("head")[0].appendChild(link);
}
// load file css
loadCss("assets/css/bootstrap.css")
// cấu hình RequireJS
requirejs.config({

    // thiết lặp đường dẫn thư mục chứa các file javascript cần thực thi
    baseUrl: 'assets/js/libs',

    // gán tên đại diện cho module
    // tên này dùng để gọi sử dụng trong hàm require() và define()
    // nếu không xác định rõ tên thì mặc định sẽ lấy đúng tên file
    // chương trình sẽ tự động thêm thành phần mở rộng (.js)
    paths: {
       jquery: "jquery", // có thể bỏ đi, mặc định sẽ tự lấy đúng tên 
       bootstrap: "bootstrap",
       // gán tên đại diện nằm ở thư mục khác
       tooltip: "../components/tooltip-button"
    },

    // quy định sự phụ thuộc
    // bootstrap chỉ được load khi jquery được load thành công
    shim: {
        bootstrap: {
            deps: [ "jquery" ]
        }
    },
});

// gọi hàm thực thi
require(["tooltip"], function(tooltip) {
    tooltip.tooltipFunc();
})

tooltip-button.js

// Gọi và thực thi các module jquery và bootstrap 
// Biến $ là đối số đại diện cho module jquery,
// Do bootstrap chỉ cần thực thi hàm tooltip() nên không cần thiết
// phải khai báo đối số đại diện
define(['jquery','bootstrap'], function($) {
    'use strict';
    // được định nghĩa tương tự
    return {
        tooltipFunc : function () {
             $('[data-toggle="tooltip"]').tooltip()
       }
    }
});

Bài viết full

RequireJS Cho Người Mới Bắt Đầu

Giới thiệu

Bài viết sẽ giúp bạn đọc có những kiến thức cơ bản về RequireJS, trả lời được những câu hỏi như RequireJS là gì, tại sao phải sử dụng, cách module hóa JavaScript, làm thế nào để tạo module với RequireJS và ứng dụng nó vào dự án.

Cùng với những ví dụ cụ thể kết hợp với chú thích rõ ràng, bài viết sẽ giúp bạn đi từ những khái niệm mang tính trừu tượng cho đến việc bạn có thể tự tay áp dụng RequireJS vào dự án. Mỗi phần sẽ có source code demo các bạn có thể tải về tham khảo.

Tiền đề bài viết

Trong quá trình tìm hiểu framework DurandalJS để tạo Single-page app (SPA). DurandalJS được tạo từ 3 thành phần chính, sử dụng RequireJS cho việc hiện thực module, sử dụng KnockoutJS để bindding dữ liệu và dùng jQuery cung cấp các tiện ích.

Đối tượng hướng đến

Yêu cầu phải có kiến thức cơ bản về JavaScript (function, object) và HTML. Biết những khái niệm về Bootstrap và jQuery.

RequireJS là gì?

RequireJS (https://requirejs.org/) là một thư viện JavaScript dùng để cải thiện tốc độ thực thi và tối ưu source code được viết bằng JavaScript nhờ việc áp dụng tư tưởng module hóa, nó cũng là một trong những thành phần chính (RequireJS, KnockoutJS) có trong framework DurandalJS – dùng để tạo single-page aplication (SPA). Tiếp cận RequireJS giúp cho các bạn có được những khái niệm cơ bản từ đó dễ dàng tìm hiểu các framework khác như Angular, ReactJS,..

Để hiểu RequireJS là gì cách tốt nhất ta nên xem qua những lợi ích mà nó mang lại cũng như cách thức để hiện thực nó.

Tại sao phải sử dụng RequireJS?

Một cách khác, bạn có thể hiểu dưới đây là các chức năng hay các công dụng của RequireJS mang lại:

  • Modules hóa

  • Optimizer

  • Testing

Để có cái nhìn sâu hơn, chúng ta sẽ đi chi tiết qua từng chức năng.

Modules hóa

Với phong cách xây dựng website truyền thống, khi muốn thực thi JavaScript thì chúng ta dùng thẻ <script> nhúng chúng vào trong phần head hoặc cuối phần body

<script src="../assets/js/libs/jquery.js"></script><script src="../assets/js/libs/bootstrapjs" ></script><script src="../assets/js/components/zoom-image.js"></script><script src="../assets/js/components/search-products.js"></script><script src="../assets/js/main.js"></script>

Việc làm như vậy chỉ phù hợp với các hệ thống website vừa và nhỏ, còn nếu muốn áp dụng cho hệ thống phức tạp thì sẽ gặp phải nhiều khó khăn:

  • Sự phụ thuộc (dependencies): mặc định trình duyệt sẽ thực thi các file .js của chúng ta một cách đồng bộ (async=false) theo trình tự, tức là file script nào được viết trước thì sẽ được thực thi hoàn chỉnh rồi đến file kế tiếp. Như vậy, một cách rõ ràng khi muốn dùng Bootstrap thì phải thực thi jQuery trước đó. Xét trường hợp file main.js có sử dụng lại các phương thức đã được định nghĩa trong zoom-image.js thì tương tự như vậy zoom-image.js phải được đặt trước file main.js. Và cứ thế, khi có nhiều script thì chúng ta phải ghi nhớ thứ tự để thực thi một các chính xác và sẽ gây ra nhiều khó khăn khi mở rộng hoặc muốn điều chỉnh tính năng nào đó.

  • Tải các script không cần thiết: khi hệ thống có nhiều trang mỗi trang thực hiện các tính năng riêng biệt khi đó sẽ cần nhiều file JavaScript để xử lý riêng phù hợp cho từng trang. Cách xử lý truyền thống như trên sẽ bị tình trạng tốn nhiều tài nguyên tải (bandwidth) và thực thi (ram) các script không cần thiết. Xét ví dụ bên trên, tại trang chi tiết sản phẩm sẽ có file zoom-image.js xử lý việc zoom ảnh đại diện cho sản phẩm, còn file search-products.js xử lý các tác vụ ở trang tìm kiếm. Hai file này hoạt động riêng lẻ không ảnh hưởng lẫn nhau nên việc tải và xử lý zoom-image.js ở trang tìm kiếm và ngược lại là điều thật sự không cần thiết.

Để giải quyết các vấn đề này và giúp code tối ưu hơn nữa, chúng ta sẽ tiếp cận khái niệm module hóa JavaScript (javascript modules). Có nhiều cách để hiện thực, đối với RequireJS thì sử dụng phương pháp AMD (Asynchronous Module Difinitions), đôi khi còn có thể sử dụng phương pháp của CommonJS.

Việc hiện thực AMD có nhiều lợi ích:

  • Cải tiến hiệu suất webiste. Bằng việc chia nhỏ thành nhiều file JavaScript thực hiện các chức năng riêng lẻ, chỉ tải và thực thi những script nào thật sự cần thiết.

  • Hạn chế lỗi. Cho phép quản lý sự phụ thuộc giữa các file JavaScript một cách dễ dàng điều này sẽ giảm tối đa việc gọi thực thi các thuộc tính hay các phương thức mà chưa được định nghĩa.

  • Dễ sửa lỗi, cập nhật và duy trì. Việc chia nhỏ các chức năng thành từng module sẽ có rất nhiều thuận lợi cho việc xác định, thu hẹp và vá các lỗi về logic. Dễ dàng thêm mới tính năng mà không làm ảnh hưởng đến cả hệ thống. Khi một module bị lỗi thì các module sử dụng nó sẽ không được thực thi, chương trình một phần nào sẽ được duy trì “ổn định”.

Trong phạm vi bài viết này, chúng ta sẽ không tập trung vào các phương pháp hiện thực JavaScript Modules mà thay vào đó sẽ cùng tìm hiểu cách module hóa code JavaScript với RequireJS bằng việc áp dụng các phương pháp mà RequireJS có thể hổ trợ (AMD, CommonJS).

Opimize

Tối ưu hóa là một tính năng cũng khá hữu ích của RequireJS dành cho các hệ thống lớn khi có nhiều tập tin JavasSript và CSS

  • Kết hợp (combine) những đoạn JavaScript liên quan với nhau thành từng file rồi tự động nén chúng lại (minify). Điều này giúp giảm băng thông do chỉ cần tải một vài tập tin cần thiết.

  • Tối ưu CSS bằng cách tự động minify (xóa khoảng trắng và các chú thích) giúp giảm dung lượng, tăng tốc độ tải trang.

Testing

Việc kiểm thử tính đúng đắng của chương trình được diễn ra một cách thuận lợi bởi RequireJS có thể tương thích với nhiều framework testing javascript như busterjs, mocha, nodeunit, qunit và jasmine.

Tóm lại, RequireJS sẽ giúp chúng ta chi nhỏ thành các module JavaScript, dễ dàng quản lý sự phụ thuộc và mối liên hệ giữa chúng; giúp cải thiện đáng kể tốc độ cũng như tối ưu các đoạn code JavaScript; và dễ dàng kiểm thử chương trình. Sau khi đã hiểu rõ được những lợi ích mà RequierJS mang lại, những nội dung tiếp theo từng bước từng bước một giúp các bạn có thể tự tay áp dụng RequireJS vào dự án của chính mình.

Cách module hóa sử dụng RequireJS

Để có cái nhìn trực quan, chúng ta sẽ hiện thực tính năng phân chia module bởi công việc này đồi hỏi nhiều kỹ thuật của lập trình viên và cũng là tính năng quan trọng hơn hết khi nói đến đến thư viện RequireJS.

Xét một ví dụ đơn giản, sử dụng thư viện jQuery và Bootstrap để xây dựng một trang có hiệu ứng tooltip khi hover qua button. Tôi đã thêm file xử lý của RequireJS (require.js), cuối cùng sẽ được cấu trúc thư mục như bên dưới

| index.html | \---assets +---css | bootstrap.css | \---js | main.js | +---components | tooltip-button.js | \---libs bootstrap.js jquery.js require.js

Ở phần này, tôi muốn các bạn thấy được kết quả khác biệt giữa phong cách code truyền thống so với việc áp dụng thư viện RequireJS để tối ưu vì vậy tôi sẽ không chú trọng đến những vấn đề khác. Đôi khi các bạn sẽ không hiểu ở một vài điểm, nhưng đừng quá lo lắng chúng ta sẽ tìm hiểu kỹ hơn ở những nội dụng kế tiếp.

File index.html (cách code truyền thống)

<!DOCTYPE html> <head>    <link rel="stylesheet" href="assets/css/bootstrap.css"></head> <body>     <div class="container">        <h1> Tradition Sample Page: on hover show tooltip button </h1>         <button class="btn btn-default" data-toggle="tooltip" title="Tooltip on top">            Hover me        </button>     </div>     <!-- code something -->     <script src="assets/js/libs/jquery.js"></script>    <script src="assets/js/libs/bootstrap.js"></script>    <script src="assets/js/components/tooltip-button.js"></script>    <script src="assets/js/main.js"></script> </body> </html>

Phần này nếu ta vô tình thay đổi thứ tự thực thi của bootstrap.js trước jquery.js thì sẽ gây ra lỗi và được thông báo bởi trình duyệt trong màn hình Console “Uncaught Error: Bootstrap's JavaScript requires jQuery at bootstrap.js:8”

File index.html (sử dụng RequireJS)

<!DOCTYPE html> <head>    <script data-main="assets/js/main" src="assets/js/libs/require.js"></script></head> <body>     <div class="container">        <h1> RequireJS Sample Page: on hover show tooltip button </h1>         <button class="btn btn-default" data-toggle="tooltip" title="Tooltip on top">            Hover me        </button>     </div> </body> </html>

File main.js

// code something// ... // gọi hàm thực thi tooltipvar b = button();b.tooltipFunc();

File main.js (sử dụng RequireJS)

// code something// ... function loadCss(url) {    var link = document.createElement("link");    link.type = "text/css";    link.rel = "stylesheet";    link.href = url;    document.getElementsByTagName("head")[0].appendChild(link);} // load bootstrap cssloadCss("assets/css/bootstrap.css") // cấu hình RequireJSrequirejs.config({     // thiết lặp đường dẫn thư mục chứa các file javascript cần thực thi    baseUrl: 'assets/js/libs',     // gán tên đại diện cho module    // tên này dùng để gọi sử dụng trong hàm require() và define()    // nếu không xác định rõ tên thì mặc định sẽ lấy đúng tên file    // chương trình sẽ tự động thêm thành phần mở rộng (.js)    paths: {       jquery: "jquery", // có thể bỏ đi, mặc định sẽ tự lấy đúng tên        bootstrap: "bootstrap",       // gán tên đại diện nằm ở thư mục khác       tooltip: "../components/tooltip-button"    },     // quy định sự phụ thuộc    // bootstrap chỉ được load sau khi jquery được load thành công    shim: {        bootstrap: {            deps: [ "jquery" ]        }    },}); // gọi hàm thực thirequire(["tooltip"], function(tooltip) {    tooltip.tooltipFunc();})

File tooltip-button.js

function button(){    return {        tooltipFunc : function () {            $('[data-toggle="tooltip"]').tooltip()        }    }}

File tooltip-button.js (sử dụng RequireJS)

// Gọi và thực thi các module jquery và bootstrap // Biến $ là đối số đại diện cho module jquery,// Do bootstrap chỉ cần thực thi hàm tooltip() nên không cần thiết// phải khai báo đối số đại diệndefine(['jquery','bootstrap'], function($) {    'use strict';     // được định nghĩa tương tự    return {        tooltipFunc : function () {             $('[data-toggle="tooltip"]').tooltip()       }    }});

Kết quả cuối cùng sử dụng 2 phương pháp đều giống nhau

Giờ đây, chúng ta đã có cái nhìn tổng thể về 2 phương pháp, có khi bạn thắc mắc việc áp dụng RequireJS có vẻ như làm cho quá trình code trở nên phức tạp và khó khăn hơn. Điều đó dường như đúng, lý do là bạn đang tiếp cận những khái niệm mới cũng như khá quen thuộc với cách code truyền thống. Nhưng từ những lợi ích mà RequireJS mang lại, việc áp dụng RequireJS là một lựa chọn cần thiết dành cho hệ thống phức tạp đồi hỏi nhiều phương thức xử lý.

Kiến thức về RequireJS

Trong phần này, chúng ta sẽ cùng tìm hiểu sâu hơn về RequireJS. Từ việc đầu tiên là cài đặt môi trường, khởi tạo project, thiết lập cấu hình cho đến định nghĩa các module.

Thiết lặp môi trường (load javascript files)

Để sử dụng RequireJS ta chỉ cần có tập tin require.js là đủ. Các bạn có thể tải tại trang chủ https://requirejs.org/docs/download.html.

Hoặc, có thể cài đặt thông qua NodeJS

  • Tải phiên bản NodeJS mới nhất tại https://nodejs.org/en/download/ (nếu chưa cài đặt)

  • Chạy lệnh command (cmd) trong thư mục muốn cài đặt project: npm install -g requirejs, sau khi chương trình tải về xong chúng ta có được cấu trúc thư mục như sau

+---.bin | \---requirejs | package.json | README.md | require.js | \---bin r.js

Điểm bắt đầu chương trình (data-main entry point)

Sau khi có require.js, chúng ta cần thêm nó vào project. Để có thể tiếp cận dễ dàng chúng ta nên bắt đầu từ sự đơn giản nhất, nên tôi có một cấu trúc thư mục như bên dưới dùng để làm ví dụ

| index.html | \---assets +---css | bootstrap.css | \---js | main.js | +---components | tooltip-button.js | \---libs bootstrap.js jquery.js require.js

Đầu tiên, chúng ta cần định nghĩa trang index.html để load RequireJS

<!-- // index.html --><html> <head>    <script data-main="assets/js/main" src="assets/js/libs/require.js"></script></head> <body>    <h1> RequireJS Sample Page </h1></body> </html>

Nếu bạn muốn sử dụng CDN (Content Delivery Netword) không muốn tải require.js về máy thì có thể sửa lại thành src="https://requirejs.org/docs/release/2.3.5/comments/require.js" chương trình vẫn thực thi một cách chính xác.

Sau khi require.js được thực thi xong, RequireJS sẽ tìm đến thuộc tính data-main, thuộc tính này dùng để xác định điểm bắt đầu của chương trình (entry point). Với trường hợp bên trên thì file “assets/js/main.js” sẽ được load một cách không đồng bộ (async) và là tập tin JavaScript bắt đầu cho chương trình.

Cũng có một cách khác để xác định điểm bắt đầu chương trình là lợi dụng việc load module thông qua định nghĩa module, nhưng cách này không được khuyến khích.

<!-- // index.html --><!DOCTYPE html> <head>    // không cần thuộc tính data-main    <script src="assets/js/libs/require.js"></script>     <script>        // yêu cầu thực thi file assets/js/main.js        // có thể thay thế thuộc tính data-main        require(['assets/js/main'], function () {            // none        });    </script></head> <body>    <h1> RequireJS Sample Page </h1></body> </html>

Cấu hình chương trình (configuration options)

Trong ví dụ trên, tập tin assets/js/main.js là tập tin JavaScript chính của chương trình, thông thường nó sẽ dùng để cấu hình các đường dẫn và sự phụ thuộc (dependencies) giữa các module cho ứng dụng chúng ta.

// cấu hình RequireJSrequirejs.config({     // thiết lặp đường dẫn thư mục chứa các file javascript cần thực thi    baseUrl: 'assets/js/libs',     // gán tên đại diện cho module    // tên này dùng để gọi sử dụng trong hàm require() và define()    // nếu không xác định rõ tên thì mặc định sẽ lấy đúng tên file    // chương trình sẽ tự động thêm thành phần mở rộng (.js)    paths: {        jquery: "jquery",        // jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min',         bootstrap: "bootstrap",        // gán tên đại diện nằm ở thư mục khác        tooltip: "../components/tooltip-button"    },     // quy định sự phụ thuộc    // bootstrap chỉ được load khi jquery được load thành công    shim: {        bootstrap: {            deps: ["jquery"]        }    },});

RequireJS hỗ trợ các tùy chọn cấu hình sau:

  • baseURL:

    • Thiết lặp đường dẫn thư mục chứa các tập tin JavaScript cần thực thi.

    • Nó sẽ không được thực thi đối với các đường dẫn bắt đầu bằng dấu “/” (slash), giao thức http/https (protocol) hoặc kết thúc bằng đuôi mở rộng .js.

    • Nếu baseURL không được sử dụng để khái báo trong hàm requirejs.config() thì đường dẫn mặc định sẽ được lấy từ thuộc tính data-main, như vậy sẽ có kết quả là baseUrl: 'assets/js' đối với ví dụ bên trên.

  • paths:

    • Dùng để gán (ánh xạ) một thư viện hoặc một module cho một biến mới, biến này sẽ làm đại diện cho thư viện / module đó khi chúng ta muốn gọi nó trong quá trình định nghĩa một module khác.

    • Trong ví dụ trên, biến jquery sẽ là tên đại diện cho thư viện jQuery, biến tooltip sẽ là tên đại diện cho module được định nghĩa trong assets/js/components/tooltip-button.js. Việc tạo biến đại diện này có tác dụng làm đơn giản hơn trong việc gọi thư viện hoặc module khi chúng ta muốn sử dụng chúng trong quá trình định nghĩa module khác.

    • Sử dụng các biến đại diện để gọi thực thi

      • define(['jquery','bootstrap', 'tooltip'], function($, btp, tooltip) {    // Sử dụng thư viện jquery.    // Sử dụng thư viện bootstrap.    // Sử dụng các phương thức đã     // được định nghĩa trong moudle assets/js/components/tooltip-button.js.});
    • Không tạo biến đại diện, phải chỉ rõ đường dẫn để gọi thực thi

      • define(['jquery','bootstrap', '../components/tooltip-button'],   function($, btp, tooltip) {    // Sử dụng thư viện jquery.    // Sử dụng thư viện bootstrap.    // Sử dụng các phương thức đã     // được định nghĩa trong moudle assets/js/components/tooltip-button.js.});
    • Đường dẫn chứa thư viện hoặc module trong thuộc tính paths này nó sẽ phụ thuộc vào đường dẫn mà chúng ta đã thiết lập ở thuộc tính baseURL trước đó. Ở ví dụ này, khi đã thiết lập baseUrl: 'assets/js/libs' và paths: { jquery: "jquery" } điều này có thể hiểu là biến jquery sẽ đại diện cho assets/js/libs/jquery.js, còn paths: { tooltip: "../components/tooltip-button"} thì biến tooltip sẽ đại diện cho assets/js/components/tooltip-button.js ( dùng “../” để trở về thư mục js ). Các bạn nên xem lại cấu trúc thư mục trong phần ví dụ để hiểu rõ cách xác định đường dẫn.

    • Có thể sử dụng giao thức http/https (protocol) khi định nghĩa thuộc tính paths

      • paths: {    // jquery: "jquery", // sử dụng ở local    // sử dụng CDN, không có thành phần mở rộng .js    jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min',     bootstrap: "bootstrap",    tooltip: "../components/tooltip-button"},
    • Đường dẫn không cần thành phần mở rộng .js, khi thực thi chương trình sẽ tự động thêm .js vào mỗi tập tin JavaScript.

  • shim:

    • Dùng để thiết lặp các sự phụ thuộc của các thư viện hoặc module theo kiểu đồng bộ (non AMD) và dùng khai báo giá trị toàn cục cho thư viện hoặc module đó (exporting their global values).

    • Ta có ví dụ, giả sử backbone.js, underscore.js, jquery.js và bootstrap.js đã được cấu hình đường dẫn ở thuộc tính baseURL (hoặc paths), các bạn xem comment để hiểu rõ hơn

      • requirejs.config({      shim: {        'bootstrap': {            // Quy định sự phụ thuộc là            // jquery.js sẽ thực thi trước bootstrap.js             deps: ['jquery'],       },        'backbone': {            //Các thư viện được khai báo trong thuộc tính deps            //sẽ được thực thi trước backbone.js            deps: ['underscore', 'jquery'],            //Khi thực thi xong, biến toàn cục "Backbone" có thể sử dụng            //để gọi thư viện này trong lúc định nghĩa module .            exports: 'Backbone'        },    }});
  • map:

    • Dùng để thiết lập cho việc sử dụng module có nhiều phiên bản làm sao phù hợp với từng trường hợp cụ thể.

    • Có ví dụ như sau, dựa vào thư viện Bootstrap để tùy biến và cá nhân hóa lại thanh menu. Tất cả các code xử lý được lưu ở custom-menu-v3.js ứng với phiên bản Bootstrap ver3. Sau này, Bootstrap cập nhật lên ver4, tôi cũng cập nhật theo, vì vậy tạo custom-menu-v4.js ứng với Bootstrap ver4. Tôi sẽ áp dụng thuộc tính map và sẽ có cấu trúc thư mục như bên dưới

      • requirejs.config({    map: {        'menu/custom-menu-v3': {            'boostrap': 'bootstrap.v3'        },        'menu/custom-menu-v4': {            'boostrap': 'bootstrap.v4'        }    }}); // Định nghĩa ở custom-menu-v3.jsdefine(['boostrap'], function (b3) {    // 'boostrap' -> bootstrap.v3.js    // Các thuộc tính và phương thức    // trong bootstrap.v3.js sẽ thực thi }) // Định nghĩa ở custom-menu-v4.jsdefine(['boostrap'], function (b4) {    // 'boostrap' -> bootstrap.v4.js    // Các thuộc tính và phương thức    // trong bootstrap.v4.js sẽ thực thi })
    • Các bạn có thể thấy, ứng với mỗi tập tin JavaScript tùy biến menu thì RequireJS sẽ thực thi phiên bản Bootstrap một cách tương ứng mà ta chỉ cần gọi tên đại diện chung là bootstrap (xem comment trên code ví dụ). Tất nhiên, bạn cũng có thể gọi như cách thông thường là define([‘bootstrap.v3.js']…) hoặc define([‘bootstrap.v4.js']…) ở mỗi tập tin JavaScript dùng để tùy biến menu, nhưng cách này thật sự không tối ưu đối với chương trình lớn mà lại có nhiều phiên bản khác nhau. Việc sử dụng thuộc tính map giúp chúng ta dễ điều chỉnh, tránh sửa code ở nhiều nơi nếu có vấn đề phát sinh.

  • config:

    • Cách mà RequireJS thiết lặp một thông tin nào đó cho một module.

      • requirejs.config({    config: {        // phải tên cùng với tên file contact.js        'contact': {            GoogMapKey: 'ABAB-CD-XX'        }    }}); // contact.jsdefine(['module'], function (module) {     var key = module.config().GoogMapKey;    // có giá trị là 'ABAB-CD-XX' })
    • Các bạn muốn thiết lập thông tin cho module được định nghĩa trong tập tin contact.js thì phải khai báo cùng tên là contact, sử dụng thông tin được gán thông qua phương thức module.config(), thông tin thực thi thành công chỉ khi được gọi trong module tương ứng.

Tôi đã giới thiệu các bạn các thuộc tính thường dùng nhất, có thể tham khảo thêm các thuộc tính khác tại trang chủ https://requirejs.org/docs/api.html#config

Định nghĩa module (define a module)

RequireJS cho phép chúng ta tải và thực thi module một cách nhanh chống, không lo lắng về sự phụ thuộc giữa các module và có thể tải nhiều phiên bản của một module trong cùng một trang. Tùy theo mục đính sử dụng, ta có các cú pháp định nghĩa như sau:

Định nghĩa module cặp Name và Value (simple name/value pairs)

Nếu module bạn chỉ cần tên đại diện và giá trị thì sử dụng cú pháp sau

define({    studentID: "15526969",    studentName: "Kong Joo Woo"});

Định nghĩa như một phương thức (definition functions)

Nếu module bạn không có các phụ thuộc (tức là không sử dụng thư viện hoặc module khác) và muốn định nghĩa như một phương thức thì có cú pháp sau

define(function () {    //Do setup work here     return {        studentID: "15526969",        studentName: "Kong Joo Woo"    }});

Định nghĩa với các phụ thuộc (defining functions with dependencies)

Nếu bạn muốn sử dụng các thư viện và các module khác đã được định nghĩa để tạo ra module mới thì chúng ta sẽ có cú pháp sau

define(["./input", "./insertDatabase"],    function(inp, ins) {              return {        // example        studentID: "15526969",        studentName: "Kong Joo Woo",               addStudent: function() {            inp.inputStudent(this);            ins.insertToDadabase(this);         }            }   });

Phương thức define() có 2 tham số, tham số đầu tiên là mảng các thư viện hoặc module cần sử dụng, tham số thứ hai dùng để định nghĩa một phương thức như thông thường có thể trả về là một phương thức (function) hoặc là một đối tượng (object). Các đối số trong phương thức này là đại diện cho từng module hoặc thư viện đã thêm vào ở tham số đầu tiên và nó phải sắp xếp đúng theo đúng thứ tự tương ứng với mảng đã thêm thì mới sử dụng chính xác.

Trong ví dụ trên, đối số inp sẽ đại diện cho module input.js, ins sẽ đại diện cho module insertDatabase.js và phương thức trong module sẽ trả về một đối tượng có 2 thuộc tính (studentID, studentName) và 1 phương thức (addStudent).

Định nghĩa module trả về một phương thức (defining a module as a function)

Khi bạn định nghĩa một module không chỉ trả về đối tượng như ở ví dụ trên mà còn có thể trả về một phương thức.

define(["./getDatabase"],    function (getD) {        return function (student) {            return getD.getStudentName(student.studentID);        }    });

Định nghĩa theo phong cách CommonJS

Ngoài việc thêm các thư viện hoặc module bằng mảng thì chúng ta có thể sử dụng require() để thực hiện.

define(function (require, exports, module) {    var ins = require('./input'),        inp = require('./insertDatabase');     //Return the module value    return function (student) {               inp.inputStudent(student);               ins.insertToDadabase(student);    };});

Định nghĩa với tên module (define a module with a name)

Đối số đầu tiên sẽ dùng để khai báo tên của module, trong ví dụ là utils/add

define("utils/add", ["./input"], function (inp) {      // something    });

Như vậy, tùy theo mục đích sử dụng các bạn có thể lựa chọn các định nghĩa phù hợp như module chỉ gồm cặp name/value, hoặc có thể trả về một đối tượng hay một phương thức. Có một lưu ý nhỏ, mỗi module chỉ nên định nghĩa trong một tập tin JavaScript riêng biệt, điều này làm cho việc gọi sử dụng module được thuận lợi do chỉ cần xác định đường dẫn (name-to-file-path).

Sử dụng require() và define()

Nếu có một chút tinh tế thì sẽ phát hiện trong những ví dụ trên tôi đã sử dụng phương thức require() và define(). Hai phương thức này có điểm chung là dùng để tải các phụ thuộc (các thư viện hoặc module), nhưng sẽ có sự khác nhau cơ bản giữa hai phương thức này. Trong đó, require() dùng để gọi thực thi các thuộc tính hay các phương thức trong module đã được định nghĩa và nó thường đặt trong main.js, còn define() sử dụng để định nghĩa module và giúp module có thể tái sử dụng dễ dàng.

Có một lưu ý, sẽ có khi bạn thấy phương thức requirejs() ở đâu đó. Nhưng đừng ngạc nhiên vì phương thức require() và requirejs() đều giống nhau.

require === requirejs // true

Các keyword hữu ích

  • single-page application (SPA)

  • AMD module javascript

  • async sync defer attributes

Kết luận

Như vậy, bài viết đã giới thiệu về RequireJS một cách cơ bản nhất, các khái niệm liên quan cũng như cách để áp dụng vào dự án. Nội dung trong bài viết này cũng là tiền đề tạo cơ sở cho việc tìm hiểu các framework được xây dựng chặt chẽ như Angular, ReactJS, VueJS. Để tiếp cận các kiến thức rộng lớn về việc sử dụng thư viện JavaScript để xây dựng website chúng ta phải tìm hiểu những khái niệm liên quan trước, trong đó RequireJS là một ví dụ.

Do bài viết chỉ mang tính chất giới thiệu tổng quan nhằm tạo ra sự dễ dàng cho những người mới bắt đầu với RequireJS, muốn hiểu rõ hơn cách hoạt động cũng như cách làm việc thì tôi khuyên các bạn tải và chạy thử các ví dụ tại trang chủ, rồi xem lại các phần ở bài viết này nếu gặp khó khăn trong quá trình đọc hiểu các ví dụ đó. Chúc các bạn thành công!

Bài viết sẽ giúp đọc giả có được những kiến thức cơ bản về RequireJS, trả lời được những câu hỏi như RequireJS là gì, tại sao phải sử dụng, cách module hóa JavaScript, làm thế nào để tạo module với RequireJS và cách ứng dụng nó vào dự án.Nội dung bài viết

logo
ccccc
a222
a1111

Các bạn có thể tải về 2 phiên bản của ví dụ trên:

Các bạn có thể tải ví dụ tại đây:

Các bạn có thể tải ví dụ:

JAVASCRIPT
HUỲNH MINH TÂN
Giới thiệu
Tiền đề bài viết
Đối tượng hướng đến
RequireJS là gì?
Tại sao phải sử dụng RequireJS?
Modules hóa
Opimize
Testing
Cách module hóa sử dụng RequireJS
Kiến thức về RequireJS
Thiết lặp môi trường (load javascript files)
Điểm bắt đầu chương trình (data-main entry point)
Cấu hình chương trình (configuration options)
Định nghĩa module (define a module)
Định nghĩa module cặp Name và Value (simple name/value pairs)
Định nghĩa như một phương thức (definition functions)
Định nghĩa với các phụ thuộc (defining functions with dependencies)
Định nghĩa module trả về một phương thức (defining a module as a function)
Định nghĩa theo phong cách CommonJS
Định nghĩa với tên module (define a module with a name)
Sử dụng require() và define()
Các keyword hữu ích
Kết luận
modules-javascript-example.zip
requirejs-map-property-example.zip
requirejs-config-property-example.zip
xxxxxxot_20180810011046
1KB
requirejs-config-property-example.zip
archive
2KB
requirejs-map-property-example.zip
archive
161KB
make-modules-javascript-example.zip
archive
87KB
modules-javascript-example - use RequireJS.rar