我正试图为教育目的构建我的第一个NPM包,我已经被困在手册中并查看了几个小时的其他项目,试图让它发挥作用.

项目设置

Project directory structure

我的包构建成功,并且从我可以断定的是,分别为ESM和CommonJS目标生成了所有文件.

该程序包也可以同时使用yarnnpm成功安装,我try 了这两种口味,只是为了确保我不是针对其中一种.My"Success"表示安装包全部为绿色,并显示在node_modules下方.

但是,当我try 使用项目中的任何对象时,我收到一个错误,指出模块未导出:

// Load application object and attach UX
import {app} from "@myproject/package/src/Application";
document.body.onload = () => {
    app.attachUx(document.body);
};

// Compiler error:
// Module not found: Error: Package path ./src/Application is not exported from package

目标环境

假设我正确理解了"NPM包",IDE不应该导入@myproject/package/src/Application,而应该导入@myproject/package/Application,因为编译目标应该"决定"它是否使用类型 script source 代码,对于CommonJS是dist/cjs,对于eMac是dist/esm

如果我确实正确理解了NPM包目标,那么当"eMac"目标使用export.import条目时,应该使用export.import条目,而"CommonJS"目标使用export.require条目吗?

终于

为什么我的项目中没有任何内容被导出?NPM不识别任何文件或定义,这意味着我try 了以下行的每一种组合来导入我的Application:

import {app} from "@myproject/package/src/Application";
import {app} from "@myproject/package/src/Application.js";
import {app} from "@myproject/package/Application";
import {app} from "@myproject/package/Application.js";
import {app} from "@myproject/package/dist/cjs/Application";
import {app} from "@myproject/package/dist/cjs/Application.js";
import {app} from "@myproject/package/dist/esm/Application";
import {app} from "@myproject/package/dist/esm/Application.js";

谢谢@mganney指出出口条目需要更准确.我最终得到了下面的Exports条目,它适用于任何场景,包括

  • 从 node 、ESM和CJS导入
  • ESM和CJS的显式/DIST导入
  • 用于Typescript 源的显式/src导入
  • 适用于IDE中的类型提示,如PHPStorm和VSCode
    "exports": {
        "./*": {
            "import": "./dist/esm/*.js",
            "require": "./dist/cjs/*.js",
            "node": "./src/*.ts"
        },
        "./dist/*": {
            "import": "./dist/esm/*",
            "require": "./dist/cjs/*"
        },
        "./src/*": "./src/*.ts"
    }

推荐答案

假设您的构建是正确的,那么最突出的就是您的Package.json中的files定义.这可能应该改为

"files": ["dist"]

因为这就是您的构建输出,至少基于您的exports定义,因为您还没有共享您的tsfig.json文件.

您可能应该更新您的exports,以更具体地说明您想要使用的条件子路径.您似乎没有一个主索 bootstrap 出,因此try 如下所示:

"exports": {
  "import": {
    "./Application.js": "./dist/esm/Application.js"
  },
  "require": {
    "./Application.js": "./dist/cjs/Application.js"
  }
}

然后,您应该更新您的import条语句,如下所示:

import {app} from '@mypackage/Application.js'

最后,您可以简化您的双重构建,因为您需要更少的NPM运行脚本,并且如果您try @knighted/duel次,则只需要一个tsconfig.json文件.您更新的构建脚本将如下所示:

"build": "npm run clean && npm run duel --dirs"

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

使用CDO时如何将Vue组件存储在html之外?

为什么在集内和集外会产生不同的promise 状态(使用Promise.race)?

JS生成具有给定数字和幻灯片计数的数组子集

django无法解析余数:[0] from carray[0]'

类型自定义lazy Promise. all

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

Spring boot JSON解析错误:意外字符错误

如何修复(或忽略)HTML模板中的TypeScript错误?'

当试图显示小部件时,使用者会出现JavaScript错误.

IF语句的计算结果与实际情况相反

在forEach循环中获取目标而不是父对象的属性

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

使用线性插值法旋转直线以查看鼠标会导致 skip

如何修复使用axios运行TSC index.ts时出现的错误?

如何根据查询结果重新排列日期

postman 预请求中的hmac/sha256内标识-从js示例转换

JWT Cookie安全性

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧