Trong Joomla, JavaScript ngày càng được người dùng không ngừng sử dụng. Hiện nay, nó đang trở thành nhu cầu cần thiết để có một cơ chế xử lý dependency thích hợp nhằm duy trì JavaScript Code.
Nội dung chính
Phương pháp tiếp cận hiện tại
Hiện nay trong Joomla, các tập tin JavaScript được khởi tạo bằng cách sử dụng chức năng PHP phía máy chủ chứa tên tập tin Javascript đến header hoặc nội dung của trang web phù hợp. Bản chất của các scripts PHP này sẽ được hiển thị như dưới đây.
Ví dụ: JHtml(‘Load Script 1’)
Điều này đòi hỏi thứ tự scripts phải phù hợp cũng như xử lý các xung đột scripts theo cách thức thủ công, việc này sẽ tương đối khó khăn và tiêu tốn khá nhiều thời gian.
Thách thức
Trước tiên, bản chất của việc khởi tạo (loading) JavaScript được kết hợp chặt chẽ với các đoạn mã PHP gọi đến những scripts này. Phương thức tiếp cận này cũng hạn chế tính mô-đun của JavaScript bởi vì việc duy trì thứ tự thực hiện theo cách thức thủ công thông qua chia tách chúng thành các chức năng riêng biệt không hề đơn giản và dễ dàng.
Ngoài ra, ở đây còn xuất hiện những vấn đề cố hữu về JavaScript, khi mà scripts này đóng vai trò là các hàm chức năng chung, việc này đòi hỏi chúng ta phải tạo ra đối tượng Global JavaScript Objects có thể giải quyết các vấn đề về bảo trì code. Đây chính là những nguyên nhân đang gây ra tình trạng sụt giảm hiệu suất khi viết JavaScript làm cho plugin và components nặng hơn.
Một trong những vấn đề chủ yếu gặp phải đó là những xung đột xảy ra giữa các bản cập nhật không mong đợi của biến JavaScript Global. Cụ thể, tôi từng có kinh nghiệm về vấn đề này khi loại bỏ MooTools dependencies trong Joomla và thay thế chúng bằng JQuery bởi vì nó được phổ biến rộng rãi trong CMS.
Tương lai của việc quản lý Dependency
Một trong những quyết định khó khăn cần phải thực hiện đó là phân tách JavaScript khỏi Server Side logic được viết bằng PHP trong Joomla. Liên quan đến vấn đề quản lý dependency, việc này sẽ bao gồm hành động loại bỏ cơ chế khởi tạo (loading mechanism) JavaScrpt dependency với việc khởi tạo PHP Script ở những nơi mà scripts được khởi tạo hiệu quả bằng chính JavaScript của nó.
Hiện nay, rất nhiều cơ chế đã được chứng minh khả năng thành công khi áp dụng trong các dự án khác nhau. Cách tiếp cận phổ biến như vậy sẽ sử dụng Asynchrony Modular Definition (phương pháp tiếp cận AMD), nó có thể khởi tạo JavaScript Dependencies (bao gồm cả các thư viện và tập file của JavaScript) được gọi. Cơ chế này cũng khuyến khích việc hạn chế sử dụng các biến Global đã được xác định cũng như mô-đun hóa JavaScript trong cách thức được người dùng yêu cầu mà không đánh mất sự cần thiết của việc khởi tạo các tập tin JavaScript theo thứ tự thực hiện.
Ví dụ, nếu Require.js đã thực hiện những công việc đó, vậy cú pháp để khởi tạo các dependencies sẽ như sau:
Khi nói đến Joomla, cú pháp khởi tạo dependency này có thể được tùy chỉnh để tạo ra cách tiếp cận như dưới đây nhằm xây dựng một thiết kế tương lai bao trùm cả thư viện hiện tại như require.js.
Joomla.LoadScript([‘’jQuery”,”Search”,”IndexJS”], function($, Search, Index){
// Logic Depending on jQuery, Search and IndexJS JavaScript Libraries
});
Mặc dù mới nhìn chúng có vẻ hơi khó hiểu, nhưng tham số đầu tiên là để xác định:
– Đường dẫn của tập tin JavaScript
– Tên hiệu ám chỉ đường dẫn
nó sẽ khởi tạo các tập tin JavaScript/module thích hợp, sau đó tạo ra chức năng gọi ngược dựa trên các mô-đun và tập tin JavaScript cụ thể. Với phương pháp này, tất cả dependencies có thể được khởi tạo trong JavaScript trước khi thực hiện các scripts riêng lẻ mà không cần bổ sung chúng vào header.
Chi phí dành cho thay đổi và quy mô
Mặc dù điều này có vẻ đang thực sự thách thức tất cả cùng một lúc, nhưng lợi ích nó mang lại cho các dự án thực sự giá trị, nó còn cung cấp khái niệm thiết kế tương lai để có thể giải quyết nhiều JavaScript được mô-đun hóa dựa trên logic nhằm nâng cao tính khả dụng của Joomla.
Trong bối cảnh thực hiện JavaScript như hiện nay, chúng ta cần thực hiện một chút thay đổi trong các thư viện JavaScript hiện tại để không làm hỏng phạm vi biến Global, nhưng để trả lại các dependencies cụ thể trong một khái niệm tương tự như cú pháp của mô-đun require.js, hãy tiếp tục khả năng tương thích cũ. Ngoài ra, mạch logic JavaScript được kết hợp chặt chẽ này có thể được phân chia thành các mô-đun khác nhau, theo hệ thống phân cấp bằng cách sử dụng các mô-đun lập kế hoạch và phân loại của JavaScript.
Mặc dù hiện nay các nhu cầu này chưa quá rõ ràng, nhưng những lợi ích của hành động thay đổi này sẽ tạo cho Joomla lợi thế giảm thiểu sự phức tạp của JavaScript và tận dụng những cải tiến công nghệ trình duyệt xuất sắc trong tương lai.