Lazy Loading and Code Splitting
Code splitting
Theo tài liệu của webpack
Code splitting là một trong những tính năng rất hữu ích của webpack cho phép chúng ta chia source code thành từng file để load cùng 1 lần. Tính năng được dùng để tạo các file với kích thước nhỏ và quản lý việc ưu tiên tải các tài nguyên. Nếu được sử dụng hợp lý, chức năng này có thể giúp cải thiện tốc độ tải trang web.
Code splitting with Laravel-mix
Laravel-mix hỗ trợ code splitting bằng hàm mix.extract()
, bạn có thể tìm thấy ở file webpack.mix.js
:
mix
.js('resources/js/app.js', 'public/js')
.extract([
'vue',
'axios',
'vuex',
'vue-router',
'vue-i18n',
'element-ui',
'echarts',
'highlight.js',
'sortablejs',
'dropzone',
'xlsx',
'tui-editor',
'codemirror',
])
Với setting này, file vendor.js (chủ yếu là các library ít khi thay đổi) sẽ được tạo ra và cache ở phía client (trình duyệt).
Lazy loading route
Theo tài liệu của Vue
Khi xây dựng ứng dụng với bundler (là trình quản lý các thư viện theo version, ở Laravue là npm/yarn), JavaScript code sẽ trở nên nặng nề và ảnh hưởng đến thời gian tải trang. Nếu chúng ta có thể tách các component ra các file nhỏ và tải nó khi component đó cần được hiển thị, thì sẽ tăng hiệu suất của ứng dụng.
Lazy loading route in Laravue
Laravue đã hỗ trợ import động các component:
{
path: '/login',
component: () => import('@/views/login/index'),
hidden: true,
},
đồng thời webpack cũng đã được cấu hình để tạo các chunks (file component riêng biệt)
module.exports = {
...
output: {
filename: '[name].js',
chunkFilename: 'js/[name].[chunkhash:6].js',
},
...
}
Bằng cách này, các component sẽ được tạo ra thành các file js riêng biệt và chỉ được load khi user mở page chứa component đó
Để cấu hình tên các chunk file (và các cấu hình khác), bạn có thể tham khảo thêm ở đây
Disable lazy loading
Vì một số lý do nào đó bạn không muốn sử dụng lazy-loading, bạn có thể tắt nó đi bằng cách thêm dynamic-import-node
vào file .babelrc
> plugins
"plugins": [
"babel-plugin-syntax-dynamic-import",
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-transform-runtime",
"babel-plugin-transform-vue-jsx",
"dynamic-import-node"
]
Combining code splitting and lazy loading
Khi chạy lệnh npm run dev/watch/production
, bạn có thể thấy các file js được sinh ra (vendor.js, app.js, chunks...)
Asset Size Chunks
/js/manifest.js 3.02 KiB 11 [emitted]
js/8.354d7a.js 10.8 KiB 8 [emitted]
js/9.6c5c36.js 26.8 KiB 9 [emitted]
js/app.js 1.81 MiB 10 [emitted] /js/app
js/vendor.js 4.43 MiB 0, 1, 3, 12 [emitted] /js/vendor