Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imove的节点import的npm包是cnpm私服上的包的解决方案 #105

Open
i5ting opened this issue May 19, 2021 · 0 comments
Open

imove的节点import的npm包是cnpm私服上的包的解决方案 #105

i5ting opened this issue May 19, 2021 · 0 comments

Comments

@i5ting
Copy link
Owner

i5ting commented May 19, 2021

imove的节点import的npm包是cnpm私服上的包的解决方案

基本原理

假定本地已经安装过debug模块,此时再执行下面脚本

import {install, printStats} from 'esinstall';

// Feature: Print detailed install stats to the console, including installed file sizes.
const {success, stats} = install(['debug']);
if (success) {
  printStats(stats);
}

在web_modules目录下面,创建debug.js和import-map.json,具体结果如下。

$ tree web_modules
web_modules
├── debug.js
└── import-map.json

0 directories, 2 files

如果指定web_modules为http目录,此时就可以直接通过http访问了。

改造

cnpm搭建npm私有源是非常常见的事儿。为了在imove的节点import的npm包是cnpm私服上的包,此时需要自己写一个服务,功能如下。

  1. 如果cnpm上没有对应包的esm版本(直接check源码是否为esm,另外一个方式通过路由里增加-esm来检测包是否存在),走esm转换生成逻辑。
  2. 通过改造esinstall,生成新的esm包,在原报名上增加-esm生成一个新的模块。将它发布在cnpm源上,注意所有-esm的包都必须是此服务生成的,否则后面会有权限问题。本身cnpm就支持版本,所以特定版本也是可以实现的,比如https://r.cnpmjs.org/debug/3.1.0对应的esm就是https://r.cnpmjs.org/debug-esm/3.1.0
  3. 【可选】该服务可以通过lru自己每天缓存新生成的n个模块。

原理

  • esinstall说白了是把cjs转成esm,看它的依赖就知道是rollup+各种lexer转换。
  • 讨厌go语言,所以esm.sh不参考

问题

  • esinstall改造比较简单,但rollup会不会比较慢,用esbuild是否可以?粗看是可以的。
  • cnpm前面加一个网关是最好的解法,那么本地起一个http服务是否能解决?通过cli调用chrome --proxy-server=xxx,其实也是可以的。本地可行,那么本地和cnpm源同步即可,这样设计也未尝不可。为此还翻了一下《狼书》卷2,里面有各种proxy技巧。

imove的做法在线写函数,然后导出文件。飞羽用的时候习惯性的直接改导出后的文件,这就涉及了2边的同步问题。

其实很好解,本地文件变动事件是能检测,根据文件名反解x6的json找到节点id,继而通过ws去更新ui里的函数即可。反之更简单。

临时想法,抛砖引玉,大家可以讨论一下。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant