如何使用 rollup 导入 javascript 模块并捆绑到单个 js 文件中?

Nat*_*iel 8 javascript node-modules rollupjs jamstack eleventy

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

然而,客户端我想要一个带有内联 JavaScript 的单个脚本标签。为了实现这个目标,我知道我需要一个捆绑器将模块拉入主脚本文件中。我选择 rollup 来完成这项工作。

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

// test.js

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

module.exports = test
Run Code Online (Sandbox Code Playgroud)

这是主要的 javascript 文件,main.js. 我想要将函数拖入的文件test.js

// main.js

import test from "/test.js"

console.log(test())
Run Code Online (Sandbox Code Playgroud)

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

// main.js

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

console.log(test())

Run Code Online (Sandbox Code Playgroud)

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

相反,汇总会产生以下结果:

(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']());

})));
Run Code Online (Sandbox Code Playgroud)

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

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

// rollup.config.js

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

Run Code Online (Sandbox Code Playgroud)

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

如何在构建时将 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));
Run Code Online (Sandbox Code Playgroud)

有所不同,但结果仍然不包含测试函数。

Jus*_*dei 4

您需要将其更改formatiife立即调用函数表达式)。

你的新的rollup.config.js应该是这样的:

// rollup.config.js

export default [
    {
        input: 'src/scripts/main.js',
        output: {
            name: 'main',
            file: "public/scripts/main.js",
            format: 'iife'
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

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

$ npm install --save-dev @rollup/plugin-commonjs
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

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'
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

另外,请确保您的导入路径正确。

这:

import test from "/test.js"
Run Code Online (Sandbox Code Playgroud)

应该:

import test from "./test.js"
Run Code Online (Sandbox Code Playgroud)

您可以在官方文档中找到更多信息。