【问题标题】:How do I package a node module for BuckleScript / ReasonML?如何为 BuckleScript / ReasonML 打包节点模块?
【发布时间】:2020-06-16 04:59:25
【问题描述】:

背景

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

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

我正在尝试将服务工作者 API 的某些部分封装在 JavaScript 中。我从一个文件 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?  

我尝试过的

  • 我猜我在这里误用了 BuckleScript 而不是 npm,因为 npm 被广泛采用并且有据可查,我认为我已经找到了问题,但我绝对不排除我的可能性也滥用 npm。
  • 我确实将“bs-service-worker”列为 bs 依赖项。我还尝试了“../bs-service-worker”,以防 BuckleScript 不喜欢虚拟目录,但它似乎没有帮助。
  • 我的npm run build 命令确实是npx bsb -make-world

更多代码:

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"
  }
}

轻松重现问题

重现此问题的最快方法是 fork this repository 并尝试将其添加为本地 npm 依赖项。

【问题讨论】:

    标签: npm reason bucklescript


    【解决方案1】:

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

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

    "namespace": "ServiceWorker"
    

    然后你可以在消费者项目中打开ExtendableEvent

    open ServiceWorker.ExtendableEvent;
    

    更多详情,请参阅documentation on the namespace field

    【讨论】:

    • 将命名空间设置为字符串有效。对于未来的观众,我还想确认:是的,当设置为 true 时,基于名称字段的命名空间模块是 BsServiceWorker。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多