首页 > 解决方案 > 如何为 BuckleScript / ReasonML 打包节点模块?

问题描述

背景

我是 BuckleScript 的绝对初学者,虽然我以前用 npm 下载过包,但我从未编写过库。

目标:使用 npm 在我的项目中安装我的新包本地包

我正在尝试用 JavaScript 包装服务工作者 api 的某些部分。我从一个文件bs-service-worker/src/ExtendableEvent.re开始,就像这样

type _extendableEvent('a);
type extendableEvent_like('a) = Dom.event_like(_extendableEvent('a));
type extendableEvent = extendableEvent_like(Dom._baseClass);

[@bs.send] external waitUntil: (extendableEvent, Js.Promise.t('a)) => unit
    = "waitUntil";

这将按预期编译并生成 ExtendableEvent.bs.js。

不过,现在,我想继续通过创建一个新的 npm 项目并导入我在本地拥有的东西来测试我目前拥有的东西。我创建了一个新的同级目录并做了一个npm install ../bs-service-worker. 成功了,然后我对我的新 BuckleScript 项目进行了健全性检查。那也成功了。

问题:打开我的模块会导致错误

当我open ExtendableEvent;在新项目中添加到 Demo.re 时,出现以下错误:

  We've found a bug for you!
  /home/el/workbench/bucklescript/bs-service-worker-examples/src/Demo.re 11:6-20

   9 │  
  10 │ /**/  
  11 │ open ExtendableEvent;  
  12 │   
  13 │ /*  

  The module or file ExtendableEvent can't be found.
  - If it's a third-party dependency:  
    - Did you list it in bsconfig.json?  
    - Did you run `bsb` instead of `bsb -make-world`  
      (latter builds third-parties)?  
  - Did you include the file's directory in bsconfig.json?  

我试过的

更多代码:

bs-service-worker/bs-config.json

{
  "name": "bs-service-worker",
  "version": "0.1.0",
  "sources": {
    "dir" : "src",
      "subdirs" : true,
      "public": "all"
  },
  "package-specs": {
    "module": "commonjs",
    "in-source": true
  },
  "suffix": ".bs.js",
  "bs-dependencies": [

  ],
  "warnings": {
    "error" : "+101"
  },
  "namespace": true,
  "refmt": 3
}

bs-service-worker-examples/bsconfig.json

{
    "name": "bs-service-worker-examples",
    "version": "0.1.0",
    "sources": {
      "dir" : "src",
      "subdirs" : true
    },
    "package-specs": {
        "module": "commonjs",
        "in-source": true
    },
    "suffix": ".bs.js",
    "bs-dependencies": [
        "bs-service-worker",
        "bs-fetch", 

    ],
    "warnings": {
        "error" : "+101"
    },
    "namespace": true,
    "refmt": 3
}

bs-service-worker-examples/package.json

{
  "name": "bs-service-worker-examples",
  "version": "0.0.1",
  "scripts": {
    "build": "npx bsb -make-world",
    "start": "npx bsb -make-world -w",
    "clean": "npx bsb -clean-world"
  },
  "keywords": [
    "BuckleScript"
  ],
  "author": "Eleanor (https://webbureaucrat.bitbucket.io)",
  "license": "MIT",
  "devDependencies": {
    "bs-platform": "^7.3.2"
  },
  "dependencies": {
    "bs-fetch": "^0.6.1",
    "bs-service-worker": "file:../bs-service-worker"
  }
}

轻松重现问题

重现此问题的最快方法是分叉此存储库并尝试将其添加为本地 npm 依赖项。

标签: npmreasonbucklescript

解决方案


问题似乎是你"namespace": true的库bsconfig.json中有一个,它将所有模块包装在一个命名空间模块中,并根据该name字段生成一个愚蠢的名称。在这种情况下,BsServiceWorker我认为。

您可以删除该设置,或将其设置为false,但命名空间是避免来自不同库或您自己的应用程序的模块之间的冲突的好主意,因此我建议将其设置为自定义的、合理的名称。例如:

"namespace": "ServiceWorker"

然后,您可以使用以下命令ExtendableEvent在消费者项目中打开:

open ServiceWorker.ExtendableEvent;

有关更多详细信息,请参阅该字段的文档namespace


推荐阅读