使 NPM 包可用于 ES6 和 ECMAScript

Making NPM package available to ES6 and ECMAScript

我正在用 TypeScript 制作一个 NPM 包,想知道如何让它可用于 ES 和 Node 模块。

我已经使用 Rollup 和一些配置对其进行了设置:

rollup.config.js

export default {
    input: 'build/kimp.js', // built from TS
    output: [
        {
            file: 'dist/main/kimp.js',
            format: 'es',
            strict: false,
            name: 'module',
            banner: `#! /usr/bin/env node - Copyright 2020 Herbie Vine - Updated: ${new Date()}`
        },
        {
            file: 'dist/module/kimp.js',
            format: 'umd',
            strict: false,
            name: 'common',
            banner: `#! /usr/bin/env node - Copyright 2020 Herbie Vine - Updated: ${new Date()}`
        }
    ],
    plugins: [
        terser(),
        resolve(),
        json(),
        commonjs({
            include: 'node_modules/**'
        })
    ],
    external: [
        'crypto'
    ]
};

package.json

{
    "name": "kimp",
    "version": "1.0.0",
    "description": "Lightweight ID generator",
    "sideEffects": false,
    "main": "dist/main/kimp.js", // import() - es6
    "module": "dist/module/kimp.js", // require() - node
    "scripts": {
        "build": "tsc -p ./src/tsconfig.json",
        "rollup": "rollup -c"
    },
    "publishConfig": {
        "registry": "https://npm.pkg.github.com/"
    },
    "keywords": [...],
    "repository": {...},
    "author": "Herbie Vine",
    "license": "MIT",
    "bugs": {...},
    "homepage": "https://github.com/herbievine/kimp#readme",
    "devDependencies": {...}
}

我尝试在 Express 应用程序中使用它,但出现错误:

const { kimp } = require('kimp');
console.log(kimp)
------
C:\Users\**\kimp-ts\dist\main\kimp.js:3484
export { kimp };
^^^^^^

这是来自 es 模块的内置版本

basic gist on github

我是否错误地认为,当节点需要一个包时,它会查看 package.json 中的 module 键。不管怎样,我已经做了好几个小时了,任何帮助都意味着很多欢呼

使用汇总,您已在 rollup.config.js 中指定的 format: 'es' 中编译成 ESModules。 Nodejs 使用 commonjs 模块并且 require 应该导入它在那里找不到的 commonjs 模块,因此你会收到错误。从节点版本 10 开始,Nodejs 开始提供对 ES 模块的实验性支持。 如果您的版本节点大于 10,您可以只更新 package.json 中的快速服务器启动脚本以允许实验模块支持,例如:"start": "node --experimental-modules server.js".

其他可行的方法取决于您的喜好或要求:

  1. 使用第三方@std/esm将es模块编译成commonjs模块使用
  2. 通过此汇总在 commonjs 模块中编译您的库 plugin

编辑:上面的代码似乎在配置中有问题并且解决了问题,package.json 中的主要和模块条目以其他方式声明并且必须交换条目才能正确设置它们。 Main 实际上应该指向 umd,module 应该指向 es 模块。