2017-03-06 14 views
7

Tôi hiện đang trong quá trình lặn vào Laravel Mix và cho đến nay, trong khi tôi hoàn toàn hiểu Laravel Mix là gì và nó hoạt động như thế nào, tôi đang cố hiểu thêm một chút về các thực hành phổ biến và 'How-Tos' ...Kết hợp nhiều tập tin với Laravel Mix

Ví dụ, hãy xem xét cấu trúc tập tin này:

/resources/assets/js/app.js (all global functions) 
/resources/assets/js/index/index.js (functions specific to index.js) 
/resources/assets/js/about/about.js (functions specific to about.js) 
/resources/assets/js/contact/contact.js (functions specific to contact.js) 

Bây giờ, lý tưởng, tôi muốn sau đây kết hợp và minified theo cách sau:

/public/js/index/index-some_hash.js (including app.js) 
/public/js/about/about-some_hash.js (including app.js) 
/public/js/contact/contact-some_hash.js (including app.js) 

Theo như tôi hiểu, con đường để đạt được điều này là một cái gì đó như sau:

// Index 
mix.js([ 
    'resources/assets/js/app.js', 
    'resources/assets/js/index/index.js' 
], 'public/js/index/index.js').version(); 

// About 
mix.js([ 
    'resources/assets/js/app.js', 
    'resources/assets/js/about/about.js' 
], 'public/js/about/about.js').version(); 

// Contact 
mix.js([ 
    'resources/assets/js/app.js', 
    'resources/assets/js/contact/contact.js' 
], 'public/js/contact/contact.js').version(); 

Câu hỏi của tôi

Rất đơn giản, tôi muốn biết nếu ở trên là phương pháp đúng để làm gì Tôi đang cố gắng làm gì? Có cách nào tốt hơn, hay cách phổ biến hơn để đạt được điều này?

Nếu cấu trúc trên sai và có các cách khác nên kết hợp các tệp của tôi, sau đó hãy chia sẻ kiến ​​thức của bạn. Tuy nhiên, trừ khi có lý do chính đáng, tôi muốn tránh những điều sau:

  • Cung cấp hai tệp riêng biệt cho mỗi trang tức là app.min.js và index.min.js. Điều này yêu cầu hai lần tra cứu trên mỗi trang, lý tưởng là ít nhất có thể
  • Cung cấp cùng một tệp cho TẤT CẢ các trang trên trang web của tôi. Phục vụ mã để một trang đó sẽ không sử dụng nó là một sự lãng phí tài nguyên, bất kể bộ nhớ đệm ...

Một Idea ...

tôi nhận thấy một dòng mã trong một trong những các tệp JS; require('./bootstrap');. Gọi cho tôi kiểu cũ nhưng tôi chưa bao giờ thấy điều này trong JavaScript (tôi giả sử nó là từ node.js). Điều đó nói rằng, rõ ràng nó chỉ là tải các tập tin bootstrap.js như là một phụ thuộc vào tập tin cụ thể. Vì vậy, với điều này trong tâm trí, sẽ là giải pháp sau được tốt hơn:

about.js

require('./app'); // Include global functions 

// Do some magic here specifically for the 'about' page... 

webpack.mix.js:

mix.js(['resources/assets/js/*/*.js'); // For all pages 

Nếu đây là một giải pháp tốt hơn sau đó làm thế nào để tôi bao gồm các tập tin bằng cách sử dụng SASS là tốt? Có cách nào ở trên có thể được cải thiện ở tất cả?

+1

tôi nghĩ rằng sass có câu lệnh 'import' hoạt động như' require' trong javascript –

+0

@CerlinBoss Perfect, điều đó có nghĩa là giải pháp 'có thể' của tôi tốt hơn giải pháp đầu tiên? –

+0

Sự khác biệt duy nhất tôi có thể thấy là một tệp 'mix' mỏng. –

Trả lời

4

Tôi muốn nói có 3 điều chính bạn phải xem xét ở đây (họ là không phải tất cả bình đẳng):

  • Kích - Lượng không gian nguồn lực của bạn sẽ mất và các tập tin kích thước đang được tải xuống.
  • Số yêu cầu - Số lượng tệp đang được tải vào trang.
  • Bộ nhớ cache của trình duyệt - Tệp sẽ được lấy từ bộ nhớ cache thay vì máy chủ.

Trong trường hợp cụ thể của bạn nó sẽ phụ thuộc vào độ lớn tập tin app.js của bạn nằm trên riêng của nó, lớn như thế nào trang file cụ thể của bạn sẽ không có mã mã từ app.js, có bao nhiêu trang cụ thể tập tin mà bạn có và nếu bạn đang sử dụng một số tài nguyên giống nhau trong tệp khác của bạn yêu cầu cùng một gói (s) trong các tệp khác nhau.


Một file

Nếu trang của bạn tập tin cụ thể được khá nhỏ sau đó tôi sẽ chỉ bao gồm chúng trong chính app.js tập tin của bạn:

require('./index/index') 
require('./about/about') 
//etc 

webpack.mix.js:

.js('resources/assets/js/app.js', 'public/js') 

Điều này có nghĩa là you'r e chỉ lưu trữ một tệp được biên dịch trên máy chủ của bạn, chỉ một yêu cầu được thực hiện cho javascript của bạn và nó sẽ được lưu vào bộ nhớ cache cho mọi lần tải trang tiếp theo trên trang web.


Một tập tin chính và một tập tin cụ thể trang

Nếu bạn có một số lượng lớn các trang file cụ thể hoặc trang file cụ thể của bạn không phải là nhỏ, sau đó tôi sẽ đề nghị có biên soạn app.js của bạn một cách độc lập các tệp cụ thể của trang của bạn. Đừng quên so sánh kết quả của phương pháp này với phương pháp Một phương thức làm phương pháp Một tệp có thể vẫn hiệu quả hơn.

webpack.min.js

.js('resources/assets/js/app.js', 'public/js') 
.js('resources/assets/js/index/index.js', 'public/js/index') 
.js('resources/assets/js/about/about.js', 'public/js/about') 

Điều này có nghĩa rằng phần lớn chính của mã của bạn (app.js) sẽ vẫn được việc lưu trữ và rằng chỉ có một yêu cầu đang được thực hiện cho mã trang cụ thể (mà nên sau đó là bộ nhớ cache cho mỗi lần tải tiếp theo của trang đó). Vui lòng lưu ý rằng nếu bạn yêu cầu các gói trong cả tệp app.js tệp và trang cụ thể của bạn, chúng sẽ không được chia sẻ trên 2 để nó sẽ tăng kích thước tổng thể cho các yêu cầu đó. Các gói có thể được thêm vào đối tượng window (ví dụ: jQuery) chỉ nên được bao gồm trong số app.js của bạn.


Một tập tin chính và một tập tin vài trang cụ thể

Nếu bạn có một hoặc hai trang file cụ thể mà là khá lớn nhưng phần còn lại không được bạn có thể biên dịch phần lớn các trang của bạn cụ thể tệp trong số app.js và các tệp lớn hơn được biên dịch thành tệp của riêng chúng.


Tất cả các trang file cụ thể

tôi sẽ chỉ đi xuống con đường này nếu tất cả các trang của bạn tập tin cụ thể là khá lớn, tập tin app.js của bạn không phải là lớn và mã/logic trong trang của bạn các tệp cụ thể không thể được tái cấu trúc để nó có thể được chia sẻ trên các tệp khác nhau.

Bằng cách này sẽ tương tự như ví dụ trong câu hỏi của bạn, tuy nhiên, thay vì phải:

webpack.min.js

mix.js([ 
    'resources/assets/js/app.js', 
    'resources/assets/js/index/index.js' 
], 'public/js/index/index.js').version(); 

bạn sẽ phải:

nguồn lực/tài sản/js /index/index.js

require('../app.js') 

//rest of file 

webpack.min.js

mix.js('resources/assets/js/index/index.js', 'public/js/index/index.js').version(); 

Tôi sẽ không bao giờ tiếp cận phương pháp này ngay lập tức và có rất ít trường hợp sẽ hiệu quả nhất.


Tóm tắt

tôi sẽ luôn tiếp cận với các cách tiếp cận Một File và sau đó nhìn vào việc tối ưu hóa sau (trừ khi một cái gì đó thực sự hút ra quá trình phát triển) như tối ưu hóa quá sớm có thể dẫn đến mã mùi và khó khăn hơn khả năng bảo trì.

Đây có thể là một bài viết tốt cho bạn là tốt https://medium.com/@asyncmax/the-right-way-to-bundle-your-assets-for-faster-sites-over-http-2-437c37efe3ff

Hope this helps!

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