Bootstrap 5 与 Grunt 捆绑和优化 js

Bootstrap 5 with Grunt to bundle and optimise js

我已经成功地使用 Grunt 将 bootstrap 5 scss 捆绑到一个文件中。我已经设置好了,所以我可以根据项目的需要添加和删除组件 scss 以进行优化。

我现在正尝试对 js 做同样的事情。

我正在使用 grunt-contrib-uglify 执行以下任务:

uglify: {
    site: {
        options: {
            sourcemap: false
        },
        files: {
            'example/static/example/assets/js/example.min.js': [

                // popper bs5 dependency
                'node_modules/@popperjs/core/dist/umd/popper.js',

                // bootstrap 5 core js
                'node_modules/bootstrap/js/dist/dom/data.js',
                'node_modules/bootstrap/js/dist/dom/event-handler.js',
                'node_modules/bootstrap/js/dist/dom/manipulator.js',
                'node_modules/bootstrap/js/dist/dom/selector-engine.js',

                // component js
                // note ordering of components can be important
                // eg. popover relies on tooltip, therefore tooltip must therefore go first
                'node_modules/bootstrap/js/dist/base-component.js',
                'node_modules/bootstrap/js/dist/alert.js',
                'node_modules/bootstrap/js/dist/button.js',
                'node_modules/bootstrap/js/dist/carousel.js',
                'node_modules/bootstrap/js/dist/collapse.js',
                'node_modules/bootstrap/js/dist/dropdown.js',
                'node_modules/bootstrap/js/dist/modal.js',
                'node_modules/bootstrap/js/dist/offcanvas.js',
                'node_modules/bootstrap/js/dist/scrollspy.js',
                'node_modules/bootstrap/js/dist/tab.js',
                'node_modules/bootstrap/js/dist/toast.js',
                'node_modules/bootstrap/js/dist/tooltip.js',
                'node_modules/bootstrap/js/dist/popover.js',

                // custom js
                'example/src/js/**/*.js'
            ]
        }
    },
},

我将它包含在我的 html 中,然后在它下面有一个脚本,例如。

<script>
    var myOffcanvas = document.getElementById('offcanvasExample')
    var bsOffcanvas = new bootstrap.Offcanvas(myOffcanvas)
</script>

我收到错误:

ReferenceError: bootstrap 未定义

在控制台中。我从捆绑包中缺少什么来完成这项工作?我在 Github 上使用 npm bs5 starter 作为文件的参考,例如。 popper 依赖项、核心 js 和导入的所有其他组件文件都在 node_modules/bootstrap/js/dist 文件夹中。

Github Bootstrap 5 npm starter

Bootstrap 5.1

波普尔 2.9.2

编辑:与分布式包一起正常工作。

我不是超级专家,不确定问题是否足够清楚,但由于性能问题和由于定义,库之间可能会崩溃,并且可能会在没有构建过程的情况下进行更新,而且您的站点可能会受到 google 引擎的惩罚。

除此之外,Boostrap 通常已经提供 .min.css.min.js 已经 compressed/minified/uglified 准备好使用,如果您不打算更改原始设计模式的任何内容,请避免使用解压缩文件,如果你不会自定义它。

关于其他自定义库或您创建的 vanilla JS 的其余部分,如果您想检查可以使用的性能,也可以使用 grunt-contrib-concat PageSpeed Insights 有了结果就会知道究竟需要应用什么才能获得更好的性能和优化。

因此使用上面相同的 grunt uglify 任务,您可以:

<script>
    var myOffcanvas = document.getElementById('offcanvasExample')
    var bsOffcanvas = Offcanvas(myOffcanvas)
</script>

(注意从脚本中删除了 new bootstrap.)。我认为这是因为当单独导入组件文件时,您没有将 Bootstrap 作为模块导入。因此与捆绑包不同,它不可用。

但是,作为单独函数的组件被导入并可用(很像上面示例中的 Offcanvas)

编辑

由于 bootstrap 5 使用汇总来捆绑它的 javascript 我现在已经研究了 'grunt-rollup' 任务。我很不高兴,因为我之前的回答与 bootstrap 文档不一致。

从那以后我就成功地使用了这个配置的 grunt-rollup 任务:

// gruntfile imports
const babel = require("@rollup/plugin-babel").default;
const path = require('path')
const {nodeResolve} = require("@rollup/plugin-node-resolve");

// rollup task
rollup: {
    options: {
        plugins: [
            babel({
                exclude: './node_modules/**',
                babelHelpers: 'bundled',
            }),
            nodeResolve()
        ],
        globals: {
            '@popperjs/core': 'Popper'
        },
        external: ['@popperjs/core'],
        format: 'umd',
        name: 'bootstrap',
    },
    files: {
        src: path.resolve(__dirname, `path/to/bootstrap5/imports/file`),
        dest: path.resolve(__dirname, `path/to/export/file`),
    },
},

bootstrap 导入文件如下所示:

import Alert from 'node_modules/bootstrap/js/src/alert'
import Button from 'node_modules/bootstrap/js/src/button'
import Carousel from 'node_modules/bootstrap/js/src/carousel'
import Collapse from 'node_modules/bootstrap/js/src/collapse'
import Dropdown from 'node_modules/bootstrap/js/src/dropdown'
import Modal from 'node_modules/bootstrap/js/src/modal'
import Offcanvas from 'node_modules/bootstrap/js/src/offcanvas'
import Popover from 'node_modules/bootstrap/js/src/popover'
import ScrollSpy from 'node_modules/bootstrap/js/src/scrollspy'
import Tab from 'node_modules/bootstrap/js/src/tab'
import Toast from 'node_modules/bootstrap/js/src/toast'
import Tooltip from 'node_modules/bootstrap/js/src/tooltip'

export default {
  Alert,
  Button,
  Carousel,
  Collapse,
  Dropdown,
  Modal,
  Offcanvas,
  Popover,
  ScrollSpy,
  Tab,
  Toast,
  Tooltip
}

现在您可以选择在 js 中包含哪些组件。