【问题标题】:How to import javascript modules and bundle into a single js file with rollup?如何使用汇总导入 javascript 模块并捆绑到单个 js 文件中?
【发布时间】:2021-04-13 14:49:53
【问题描述】:

我有想要在服务器端和客户端运行的 javascript 函数。服务器端使用node.js,可以很好地处理导入。

但是,客户端我想要一个带有内联 javascript 的单个脚本标记。为了实现这个目标,我知道我需要一个捆绑器来将模块拉入主脚本文件。我选择汇总来完成这项工作。

这是我尝试过的一个示例。我制作了一个模块test.js。这是一个返回字符串的简单函数:

// test.js

const test = () => {
    return 'testing'
}

module.exports = test

这是主要的 javascript 文件,main.js。我要拉入test.js函数的文件:

// main.js

import test from "/test.js"

console.log(test())

这是我希望 main.js 捆绑后的样子:

// main.js

const test = () => {
    return 'testing'
}

console.log(test())

我想简单地将函数拉入文件中。

而不是汇总产生这个:

(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('../../../../../../../js/test.js')) :
    typeof define === 'function' && define.amd ? define(['../../../../../../../js/test'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.test));
}(this, (function (test) { 'use strict';

    function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

    var test__default = /*#__PURE__*/_interopDefaultLegacy(test);

    console.log(test__default['default']());

})));

代码比以前大得多,关键是模块没有合并到主文件中。它仍然是一个模块,但具有不同的语法。 Rollup 有许多输出选项,都产生相似的结果。

这是我的rollup.config.js 文件:

// rollup.config.js

export default [
    {
        input: 'src/scripts/main.js',
        output: {
            name: 'main',
            file: "public/scripts/main.js",
            format: 'umd'
        }
    }
]

当然,对于了解正在发生的事情的人来说,这是预期的输出。但我不明白。

如何在构建时将 javascript 合并到一个文件中?

我忽略了一个更简单的解决方案吗?

编辑:使用commonjs 模块并将输出格式设置为iife 会产生以下结果:

// main.js

(function (test) {
    'use strict';

    function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

    var test__default = /*#__PURE__*/_interopDefaultLegacy(test);

    console.log(test__default['default']());

}(test));

不同了,但是结果还是不包含测试函数。

【问题讨论】:

  • 请分享您的汇总配置。
  • 我已更新问题以包含汇总配置。谢谢。

标签: javascript node-modules rollupjs eleventy jamstack


【解决方案1】:

您需要将format 更改为iife (Immediately Invoked Function Expression)。

您的新rollup.config.js 应该如下所示:

// rollup.config.js

export default [
    {
        input: 'src/scripts/main.js',
        output: {
            name: 'main',
            file: "public/scripts/main.js",
            format: 'iife'
        }
    }
]

如果您还需要使用 CommonJS 导出(module.exports = ___ 而不是 ES6 export default ___),则需要安装 @rollup/plugin-commonjs

$ npm install --save-dev @rollup/plugin-commonjs

然后像这样使用它:

import commonjs from '@rollup/plugin-commonjs'

export default [
    {
        input: 'src/scripts/main.js',
        plugins: [commonjs()],
        output: {
            name: 'main',
            file: "public/scripts/main.js",
            format: 'iife'
        }
    }
]

附带说明,请确保您的导入路径正确。

这个:

import test from "/test.js"

应该是:

import test from "./test.js"

您可以在official docs找到更多信息。

【讨论】:

  • 感谢您的帮助。我已按照您的建议完成并在编辑中添加了结果。
  • 啊,那是因为您从/test 导入测试而不是./test。 Rollup 将无法找到的模块视为外部依赖项。我会更新答案以包含它。
  • 太棒了,现在更有意义了。我已经更新了我的代码并且可以确认它有效。
  • 如果这回答了您的整个问题,您介意将答案标记为正确吗?它对我有很大帮助:)
  • 完成。感谢您的帮助。
猜你喜欢
  • 2020-09-15
  • 1970-01-01
  • 2017-03-23
  • 2019-01-22
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2015-10-21
  • 2021-11-30
相关资源
最近更新 更多