2013-05-13 22 views
9

Câu hỏi này đã được hỏi nhiều lần nhưng không cụ thể cho ví dụ này.Mô-đun phá vỡ bộ nhớ cache cụ thể với RequireJS

Dưới đây là một tổng quan về ứng dụng của chúng tôi:

  • Simple máy chủ định tuyến với Express trên Node
  • trang Độc xương sống đơn
  • module Core và thư viện (JS/CSS) mà không thay đổi
  • Tệp JS/LESS/HTML của tiện ích con thường xuyên thay đổi

Trong khi phát triển, tôi đang tìm kiếm bộ nhớ cache các tệp thay đổi nhưng không phải là các thư viện cốt lõi để tăng tốc độ tải lại trang của tôi và tăng tốc độ phát triển của tôi.

Tôi đã tìm thấy lời giải thích trên:

  1. cache Busting trên RequireJS - here
  2. Giải thích về bộ nhớ cache Busting Modules cụ - here

thể các giải pháp:

  1. Giải thích làm thế nào các yêu cầu bộ nhớ đệm busting hoạt động?
  2. Cung cấp giải pháp cho trường hợp cụ thể này.

Trả lời

4

Tính năng chặn truy xuất bộ nhớ cache hoạt động bằng cách thêm chuỗi truy vấn luôn duy nhất vào cuối mỗi tệp được yêu cầu. Nó sử dụng giá trị cấu hình urlArgs của RequireJS; RequireJS sẽ chăm sóc của phụ đó cho bạn:

urlArgs: "bust=" + (new Date()).getTime() 

Phần (new Date()).getTime() chỉ là một cách đơn giản để có được một chuỗi duy nhất ra khỏi JavaScript. Bạn có thể thực hiện một số thay đổi trên Math.random(), nhưng việc sử dụng number of milliseconds since the epoch đảm bảo tính duy nhất, để tối ưu hóa bộ nhớ cache.

Tôi nghĩ rằng ông Burke được gợi ý gì đó như:

require.config({ 
    baseUrl: '/base/path', 
    paths: { 
     'fileAlias': 'fileLikelyToChange?bust=' + (new Date()).getTime(), 
     'anotherFileAlias': 'anotherFileLikelyToChange?bust=' + (new Date()).getTime(), 
     'jQuery': 'jQuery' 
    }, 
}); 

Vì vậy, thay vì phổ biến urlArgs sửa bộ nhớ cache, bạn áp dụng nó đặc biệt để mỗi tập tin đó là khả năng thay đổi; do đó, không bao gồm bất kỳ thư viện nào.

tôi đã không kiểm tra nó, nhưng tôi muốn có thể gọn gàng nó lên đến một cái gì đó như:

function bust(path) { 
    return path + '?bust=' + (new Date()).getTime(); 
} 

require.config({ 
    baseUrl: '/base/path', 
    paths: { 
     'fileAlias': bust('fileLikelyToChange'), 
     'anotherFileAlias': bust('anotherFileLikelyToChange'), 
     'jQuery': 'jQuery' 
    }, 
}); 
+1

Cảm ơn - những gì về các tệp được bao gồm trong ứng dụng của tôi nhưng không được tham chiếu trong đối tượng require.config - paths? – imrane

+0

Đối với kịch bản đó, tôi không nghĩ rằng có một giải pháp dễ dàng. Tôi chỉ mô tả những gì tôi nghĩ đã được đề xuất trong vấn đề GitHub. Tôi không nghĩ rằng bạn thực sự có bất kỳ lựa chọn nào khác, thiếu sửa đổi nguồn của RequireJS hoặc tạo một bản hack phức tạp. – c24w

0

Chỉ cần nhớ rằng nếu bạn thực sự cần phải dựa vào một số kịch bản bên ngoài mà bạn có thể sử dụng thay vì $.getScript yêu cầu để đảm bảo rằng nó được bao gồm. Tôi có một số tập lệnh không phải là mã amd dành cho tích hợp bên thứ ba (ví dụ: thanh toán amazon), mà tôi đã sử dụng getScript thay vì yêu cầu. Nếu bạn có thể sử dụng phương thức này, nó sẽ tránh gửi các tham số busting cache từ urlArgs đến máy chủ bên ngoài.

Các vấn đề liên quan