首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 6+ Webpacker延迟加载

Rails 6+ Webpacker延迟加载
EN

Stack Overflow用户
提问于 2019-11-18 21:26:59
回答 1查看 1.9K关注 0票数 0

我正在运行rails assets:precompile,它输出如下:

代码语言:javascript
复制
WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
    This can impact web performance.
    Assets: 
      js/application-c4e0541a90e01b47fbfe.js (1.21 MiB)
      js/chartkick-b109b176a3de896848c7.js (657 KiB)
      js/datatables-fca8769ee16df57bdc4a.js (296 KiB)
      js/application-c4e0541a90e01b47fbfe.js.gz (305 KiB)
      js/datatables-fca8769ee16df57bdc4a.js.map.gz (482 KiB)
      js/chartkick-b109b176a3de896848c7.js.map.gz (493 KiB)
      js/application-c4e0541a90e01b47fbfe.js.map.gz (1.09 MiB)

WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
Entrypoints:
  application (1.21 MiB)
      js/application-c4e0541a90e01b47fbfe.js
  chartkick (657 KiB)
      js/chartkick-b109b176a3de896848c7.js
  datatables (296 KiB)
      js/datatables-fca8769ee16df57bdc4a.js


WARNING in webpack performance recommendations: 
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.
For more info visit https://webpack.js.org/guides/code-splitting/

我一直在寻找懒散的加载,但找不到任何关于rails的东西(我是webpacker,js等的超级新手)。例如,这个链接解释了如何分割代码和延迟加载,但我不知道如何在我的超级简单代码上调用它。

下面是我所拥有的可数据代码的一个示例:

代码语言:javascript
复制
//Global setting and initializer
// Add DataTables jQuery plugin
require('imports-loader?define=>false!datatables.net')(window, $)
require('imports-loader?define=>false!datatables.net-select')(window, $)
require('imports-loader?define=>false!datatables.net-bs4')(window, $)
require('imports-loader?define=>false!datatables.net-select-bs4')(window, $)

// Load datatables styles
 import 'datatables.net-bs4/css/dataTables.bootstrap4.css'
 import 'datatables.net-select-bs4/css/select.bootstrap4.css'

$(document).on('turbolinks:load', () => {
  $(document.body).on('click', '#check_all', () => {
    var checkBoxes = $('input[type="checkbox"]')
    checkBoxes.prop("checked", !checkBoxes.prop("checked"))
  })
})


// init on turbolinks load
$(document).on('turbolinks:load', function() {
  if (!$.fn.DataTable.isDataTable(".datatable")) {
    $(".datatable").DataTable();
  }
});

// turbolinks cache fix
$(document).on('turbolinks:before-cache', function() {
  var dataTable = $($.fn.dataTable.tables(true)).DataTable();
  if (dataTable !== null) {
    dataTable.destroy();
    return dataTable = null;
  }
});

我很想得到一些提示,因为它阻塞了我的应用程序,应用程序崩溃了。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 06:13:28

要添加动态导入,您可能需要对现有代码进行一些更改:

  1. 提取用于有条件初始化插件实例的函数。
  2. 对每个可数据模块或导入这些模块的单独文件使用import().then()动态导入语句。

提取初始化函数

由于您将异步导入数据,所以还不能指望它被加载。这只是一个例子,但是处理这个问题的一种方法是在任何您想要进行数据对象初始化的地方都有一个可重用的函数(或者另一个用于“前缓存”钩子),如果数据还没有加载,这个函数就会表现得很优雅。

代码语言:javascript
复制
function initializeDatatables() {
  if (!$.fn.DataTable) return;

  if (!$.fn.DataTable.isDataTable(".datatable")) {
    $(".datatable").DataTable();
  }
}

使用动态导入

由于您有四个单独的导入,所以可以尝试将它们作为一个“块”从一个单独的文件导入:

代码语言:javascript
复制
// app/javascript/datatables.js
require('imports-loader?define=>false!datatables.net')(window, $)
require('imports-loader?define=>false!datatables.net-select')(window, $)
require('imports-loader?define=>false!datatables.net-bs4')(window, $)
require('imports-loader?define=>false!datatables.net-select-bs4')(window, $)

// your original initializer file
import('./datatables').then(initializeDatatables)

$(document).on('turbolinks:load', initializeDatatables);

您也可以尝试使用splitChunks api,以便Webpack将您的JS放在单独的块中,但这是一个不同的主题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58923165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档