Tập hợp CSS và JS hoạt động như thế nào trong Drupal?


7

Khi Drupal được thiết lập để tối ưu hóa JS và CSS, nó sẽ tạo các thư mục 'js' và 'css' trong thư mục gốc hệ thống tệp công khai của bạn. JS và CSS tổng hợp được lưu trữ trong các thư mục này. Tôi đã cố gắng tìm ra cách Drupal theo dõi các tệp này và cách Drupal khớp với yêu cầu trang do đó đối với các tệp tổng hợp có thể áp dụng trong các thư mục này. Tên tệp có phải là hàm băm dựa trên URL yêu cầu không?

Ngay bây giờ, tôi đang làm việc trên một trang web có 4 máy chủ web. Tất cả các máy chủ web có cùng bộ lưu trữ được gắn kết với hệ thống tệp công khai và riêng tư của họ. Khi một máy chủ tạo các tệp CSS và JS cho một trang, làm thế nào để bất kỳ máy chủ nào khác sử dụng các tệp được tạo này cho một yêu cầu thụt lề?

Câu trả lời:


14

Các tệp CSS / JS được thêm vào Drupal theo nhiều cách khác nhau; 5 trong số 7 cách cho phép tập tin được tổng hợp. Khi chúng đã được thêm vào trang, drupal sẽ hiển thị đánh dấu html cho chúng và tạo / sử dụng đánh dấu bên trong template_ process_html () .

Các hàm để tìm cách tổng hợp được xây dựng là drupal_build_js_cache () & drupal_build_css_cache () . Bên trong các chức năng này, nó nhận được một danh sách các tên tệp và sau đó tạo ra một hàm băm của chúng. Đây là một tra cứu, để xem nếu tập tin đã được tạo.

  $map = variable_get('drupal_js_cache_files', array());
  // Create a new array so that only the file names are used to create the hash.
  // This prevents new aggregates from being created unnecessarily.
  $js_data = array();
  foreach ($files as $file) {
    $js_data[] = $file['data'];
  }
  $key = hash('sha256', serialize($js_data));
  if (isset($map[$key])) {
    $uri = $map[$key];
  }

Nếu nó chưa được tạo trước đó, vì thứ tự và / hoặc nội dung của thông tin $ file ['data'] thì nó sẽ tạo ra một tổng hợp mới dựa trên tất cả các nội dung tệp được xâu chuỗi lại với nhau.

  if (empty($uri) || !file_exists($uri)) {
    // Build aggregate JS file.
    foreach ($files as $path => $info) {
      if ($info['preprocess']) {
        // Append a ';' and a newline after each JS file.
        $contents .= file_get_contents($path) . ";\n";
      }
    }
    // Prefix filename to prevent blocking by firewalls which reject files
    // starting with "ad*".
    $filename = 'js_' . drupal_hash_base64($contents) . '.js';
    // Create the js/ within the files folder.
    $jspath = 'public://js';
    $uri = $jspath . '/' . $filename;
    ...
    $map[$key] = $uri;
    variable_set('drupal_js_cache_files', $map);
  }
  return $uri;

Các tập tin được theo dõi bên trong 2 biến drupal_js_cache_filesdrupal_css_cache_files; Drupal cũng sẽ kiểm tra để đảm bảo tập tin tồn tại trước khi nó được sử dụng. Các tổng hợp không có gì để làm với URL. 4 webhead của bạn sẽ sử dụng các tổng hợp này do các biến được lưu trữ trong cơ sở dữ liệu.

Lưu ý: AdvAgg tương tự như thế này nhưng nó sử dụng một vài bảng cơ sở dữ liệu thay vì 2 biến; AdvAgg thực hiện điều này vì một vài lý do chủ yếu là khắc phục các sự cố với biến_set đồng thời và cho phép logic nhóm nâng cao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.