A module federation SDK which is unrelated to tool chain for module consumer.

Overview

hel-logo

hel-micro, 模块联邦sdk化,免构建、热更新、工具链无关的微模块方案

Demo

hel-loadash codesandbox

hel-loadash git

Why hel-micro

image

如何使用远程模块

仅需要一句npm命令即可载入远程模块,查看下面例子线上示例

  • 1 安装hel-micro
npm i hel-micro
  • 2 惰性加载远程模块

示例:调用hel-lodash 模块的方法

import { preFetchLib } from 'hel-micro';
async function ran(seed){
  const mod = await preFetchLib('hel-lodash'); // 首次加载触发模块下载,之后会从hel-micro缓存获取
  const num = mod.myUtils.num.random(500);
  return num;;
};
  • 3 预加载远程模块

示例:静态导入hel-lodash后调用其模块方法

安装hel-lodash

npm i hel-lodash

先执行模块拉取动作

import { preFetchLib } from "hel-micro";

async function main() {
  await preFetchLib("hel-lodash");
  await import("./loadApp"); // 入口文件后移
}

在入口文件里关联的任意文件处静态导入hel-micro并调用模块方法

import m from 'hel-lodash';
console.log(m.myUtils.num.random(500);) // 获得随机数

hel-micro

前端微件化sdk,基于 hel-micro 可实现跨项目共享代码、模块热更新、微前端架构等功能

hel-micro-react

依赖 hel-micro 基础 api 实现的 react 组件加载库

Comments
  • 关于hel-micro中声明文件讨论

    关于hel-micro中声明文件讨论

    跑了下hel-micro的demo,发现,hel-micro的声明文件是通过remote,npm publish的方式,将声明文件发到npm,然后消费remote的方,在通过npm把remote下载下来,然后remote业务代码通过远程加载hel-json加载。

    这样是能保证remote的js是最新的,但是不能保证业务方,拿到的remote的声明文件是最新的(除非每次发一次remote,就让所有消费方npm install remote,但这样感觉本末倒置了),请问后续有啥关于remote声明文件优化的方向吗?

    如果是我哪弄错了,麻烦指点。

    good first issue 
    opened by lzs246 8
  • 本地虚拟化共享模块,而非云端共享模块,类似本地调试的感觉

    本地虚拟化共享模块,而非云端共享模块,类似本地调试的感觉

    想法来自于hel的本地调试,可以自定义preFetchLib的获取源host。有很多时候需要使用的包全部都是本地化的部署,例如:某一内网,不涉及公网环境。虽然目前可以指定源。但如果preFetchLib的包未发布(即包不能通过npm的形式安装到项目中),虽然目前也是支持获取内网共享模块的,但使用上不太统一不是很优雅。 公网可安装的npm包使用方式为:

    import helJsLib from 'hel-jsLib';
    await preFetchLib('hel-jsLib')
    // 然后就可以使用helJsLib中共享模块了
    helJsLib.xx.xx
    

    公网未安装的依赖共享包当前可使用方式:

    // 先加载
    const lib = await preFetchLib('虚假的包名',{custom:{host:'http://xxx.xxx'}})
    // lib可以正常使用
    lib.xx.xx
    // 如果多个地方需要使用,要么挂载到windiw或者项目内的某一变量也是可以达到效果的
    // 挂载到某一变量
    globalVar.jsLib = lib;
    
    // 其他文件使用时先获取到globalVar再调用可行
    globalVar.jsLib.xx.xx
    

    1.未发布的内网共享模块与已发布的模块使用差别上有所区别,个人觉得不是很优雅,有点黑魔法的味道 2.如果后面使用的共享模块已安装且可访问公网,从内网使用模块方式切到公网模块使用方式上需要改动的地方较多 3.如果将'虚假的包名'通过类似于 libReady 的api生成一个假的包,达到和libReady提供的能力一样的效果,这样未发布的内网共享模块也可以和公网环境的共享包达到一致的使用体验。 如下的使用:

    // 假如 hel-mirco 提供一个 libLocalReady 的api,使用者角度的伪代码如下
    const localLibName = `本地自定义的名称`;
    // 配置生成本地虚拟的包
    await libLocalReady(localLibName,{custom:{host:"http://localhost:9999"}})
    
    // file to other.ts 
    // 和公网已发布的包一样先导入直接使用
    import localLibName from 'localLibName'
    localLibName.xx.xx
    
    opened by itmanyong 4
  • [feature] 针对国内用户提供 gitee 源备份

    [feature] 针对国内用户提供 gitee 源备份

    背景

    本项目会提供一些模板供用户下载使用,做到了开箱即用。也因为众所周知的原因,国内用户下载远程内容时候,时常卡死直到超时。用户体验不好。

    解决思路

    考虑到这种情况,建议可以同时维护一份 gitee 官方仓库,通过修改 github action 自动将 main 分支的提交同步到 gitee 。这样下载模板时候提供两套源,保证随时可用。

    比如 https://github.com/ShixiangWang/sync2gitee 提供了一些设计思路,这会设计到 .github/workflows 的一些更改。

    enhancement 
    opened by Otto-J 3
  • [docs] 用户获取模板库时候建议改为 degit

    [docs] 用户获取模板库时候建议改为 degit

    degit https://www.npmjs.com/package/degit 是一个常用的工具,可以快速下载远程仓库或者仓库里文件夹。

    建议文档中从 git clone 改为 npx degit 这样有两个好处

    • 用户下载的模板是纯文件夹,没有 git commit 提交历史,自行 git init 提交更干净
    • 后续可以拆分为多个文件夹,对应不同的模板,下载时候下载对应的文件夹,有更好的拓展性
    enhancement 
    opened by Otto-J 3
  • 本地运行React-ts模版

    本地运行React-ts模版

    仓库:https://github.com/hel-eco/hel-tpl-remote-react-comp-ts

    背景

    拉模板代码,本地yarn start,好像是提供不了本地remote服务(如果我错了,麻烦纠正)

    我看了一下,yarn start,是跑的script/start.js,但是这个脚本里面就起了一个webpackDevServer,不具备生成hel-json的能力。

    我试了一下,写个webpack插件,调用helDevUtils.extractHelMetaJson来生成hel-json,但是发现webpackDevServer中的文件是保存在内充中,没有文件实体,导致要修改太多。

    我想请问下如果想让模版,拥有本地调试hel-micro中remote的能力(yarn start),请问有啥办法

    望大佬指点

    opened by lzs246 3
  • hel-micro是解决什么问题的?

    hel-micro是解决什么问题的?

    你好: 看了你们的文档,还是不明白hel-micro是想解决什么问题,是解决的js模块的动态加载吗?是因为es6的动态import不友好做的替代方案吗? 看文档上说,“通过规范打包协议实现模块联邦sdk化. 和模块使用方工具链无关” 这是说打包的时候实现模块联邦sdk化吗?是通过hel-micro实现还是说micro具备这样的特性?模块联邦不是webpack5的功能吗?

    opened by codepandy 3
  • 消费方报错

    消费方报错

    image
    export default function HomePage() {
      useEffect(() => {
        bindReactRuntime({ React, ReactDOM });
      }, []);
    
      return (
        <div>
          <button
            onClick={() => {
              preFetchLib("hel-tpl-remote-react-comps-ts", {
                custom: { host: "http://localhost:3103", enable: !!location.port }
              })
                .then((res) => {
                  console.log("远程包", res);
                })
                .catch(console.log);
            }}
          >
            test
          </button>
        </div>
      );
    }
    

    hel-tpl-remote-react-comps-ts 就是仓库里的模板,没做过改动

    opened by yoyooyooo 2
  • 请教一下关于hel-micro-core中源码的一个小问题

    请教一下关于hel-micro-core中源码的一个小问题

    在执行preFetchLib中,会去请求lib对应的hel-json,然后拿到lib对应的资源地址,加载完lib对应的资源后,然后会从cache的appName2verEmitLib中取出。

    代码: image

    然后我这边疑问的是

    before打印 image

    after打印 image

    loadAssetsStarter函数又只去加载了lib的js和css,我没有弄明白appName2verEmitLib是从哪赋的值,是在lib的产物js中吗?还是说在别的地方呢?

    麻烦大佬赐教

    question 
    opened by lzs246 1
  • English docs

    English docs

    This is an interesting project. I think an english readme + docs could help with adoption.

    Machine translating the docs via the browser is far from perfect and no real fun if questions arise.

    documentation 
    opened by adroste 1
  • [MF vs hel-micro] Why is hel-micro a better implementation of module federation

    [MF vs hel-micro] Why is hel-micro a better implementation of module federation

    Why is hel-micro a better implementation of module federation

    为何hel-micro是更好的模块联邦实现,可阅读模块联邦新革命了解

    MF issues list for helping users find hel micro: https://github.com/webpack/webpack/issues/16398 https://github.com/webpack/webpack/issues/11811 https://github.com/webpack/webpack/issues/13176 https://github.com/webpack/webpack/issues/13457 https://github.com/webpack/webpack/issues/13912 https://github.com/webpack/webpack/issues/14310 https://github.com/webpack/webpack/issues/15554 https://github.com/webpack/webpack/issues/15829 https://github.com/webpack/webpack/issues/16173 https://github.com/webpack/webpack/issues/16242


    https://github.com/originjs/vite-plugin-federation/issues/248 https://github.com/originjs/vite-plugin-federation/issues/251 https://github.com/originjs/vite-plugin-federation/issues/246 https://github.com/originjs/vite-plugin-federation/issues/253 https://github.com/originjs/vite-plugin-federation/issues/262


    https://github.com/umijs/qiankun/issues/2105 https://github.com/umijs/qiankun/issues/2256 https://github.com/umijs/qiankun/issues/1515 https://github.com/umijs/qiankun/issues/1079


    https://github.com/micro-zoe/micro-app/issues/571 https://github.com/micro-zoe/micro-app/issues/278 https://github.com/micro-zoe/micro-app/issues/559 https://github.com/micro-zoe/micro-app/issues/634


    https://github.com/module-federation/module-federation-examples/issues/2033 https://github.com/module-federation/module-federation-examples/issues/1740 https://github.com/module-federation/module-federation-examples/issues/969 https://github.com/module-federation/module-federation-examples/issues/2294 https://github.com/module-federation/module-federation-examples/issues/2331


    https://github.com/single-spa/single-spa/issues/998

    documentation 
    opened by fantasticsoul 0
  • 【运营】谁在使用中

    【运营】谁在使用中

    欢迎提供你的公司logo,公司名,截图、站点等信息,提供给其他用户一些参考信息,让未来有更多的人参与到hel-micro的建设与使用中。


    腾讯云

    腾讯新闻

    基于低代码平台拖拽的一些h5活动页案例: https://news.qq.com/elk/publish/elk_62ea332eec92420161105f92.html https://news.qq.com/elk/publish/elk_62580356b1142401de2414ca.html

    documentation 
    opened by fantasticsoul 0
  • Hel-micro + npm私有仓库 + unpkg私有部署实现模块联邦的最佳实践

    Hel-micro + npm私有仓库 + unpkg私有部署实现模块联邦的最佳实践

    Hel-micro + npm私有仓库 + unpkg私有部署实现模块联邦的最佳实践

    所谓工欲善其事,必先利其器(搭建环境)

    npm私有仓库

    一.原理

    我们平时使用npm publish进行发布时,上传的仓库默认地址是npm,通过Verdaccio工具在本地新建一个仓库地址,再把本地的默认上传仓库地址切换到本地仓库地址即可。当npm install时没有找到本地的仓库,则Verdaccio默认配置中会从npm中央仓库下载。

    二.常用的仓库地址
    • npm : https://registry.npmjs.org/
    • cnpm : http://r.cnpmjs.org/
    • taobao: https://registry.npm.taobao.org/
    三.优势
    • 私密性高,仅团队共享。
    • 安全性高,能够有效的防治恶意代码攻击。
    • 使用局域网,传输速度快。
    四.准备环境

    兵马未动,粮草先行,既然是搭建私有仓库应用,基础环境得备好。

    • node 14.19
    • git
    • verdaccio
    • nrm(快速切换仓库源)
    • pm2(守护进程)
    五.使用verdaccio搭建私有npm服务
    • 安装
    npm install -g verdaccio
    
    • 运行。启动时间会很久,断开cmd会关掉服务,可以使用pm2守护进程即可。
    // 访问http://localhost:4837
    verdaccio
    
    • 配置config.yaml,使局域网下能共享访问,否则只能本机访问。
    // 最后面添加以下配置
    listen: 0.0.0.0:4873
    
    • 重启,必须重启电脑配置才能生效。
    • 重新运行
    // 访问http://ip:port/
    // 不要访问本地localhost下的
    verdaccio
    
    • 使用nrm新建本地仓库
    nrm add <registry> http://localhost:4873
    
    • 使用nrm切换到本地仓库
    nrm use <registry>
    
    • 使用nrm查看是否新增成功
    nrm ls
    
    • 注册verdaccio账号,一定要先保证切换到本地的源仓库的前提下,因为你注册的账号是保存在对应仓库源上的。
    npm adduser
    // 输入账号和密码
    
    • 上传仓库
    // 登录
    npm login
    // 发布
    npm publish
    
    • 访问http://ip:port 进行登录

    unpkg私有化部署

    上一章节将npm搭建到服务器了,接下来就是要搭建unpkg cdn服务,并且将上一章节搭建的npm私有仓库连接到unpkg私服上 首先搭建unpkg私服

    一.拉取unpkg源码

    git clone https://github.com/mjackson/unpkg.git
    # 安装依赖
    $ npm i
    

    在package.json的script添加start命令:

    "scripts": {
        "build": "rollup -c",
        ...
        "watch": "rollup -c -w",
        "start":"set NODE_ENV=production&&node server.js"
      },
    

    执行编译命令:

    npm run build
    

    命令运行完后会在根目录生成server.js文件; 启动服务:

    npm run start
    

    我们自己搭建的unpkg已经可以正常的使用了,但是目前我们私库的npm包还是不能访问,记下来就是添加私库支持了;

    二.unpkg添加私库支持

    根目录新建npmConfig.js来存放私库包的命名空间:

    //存放私库包的命名空间
    export const scopes = [
        '@cz','@syl'
    ];
    /****
     * 私库地址,代理端口会解析url的端口号
     * const privateNpmRegistryURLArr = privateNpmRegistryURL.split(":");
     * const privateNpmPort = privateNpmRegistryURLArr[privateNpmRegistryURLArr.length - 1]
     * 拉取一些npm的包会返回302的情况,unpkg暂时没有处理,会不会和本地的npm源有关?
     ***/
    export const privateNpmRegistryURL = 'http://10.250.4.121:8088';
    
    //互联网npm地址
    export const publicNpmRegistryURL = 'http://registry.npmjs.org';
    
    export default scopes;
    

    接下来就是修改修改modules/utils/npm.js文件了,思路大概如下:

    • 私库地址为http,需要修改https为http;
    • 设置我们私库的端口;
    • 根据npmConfig.js中的scopes去匹配unpkg请求的包,如果是私库的包,就走内网的npm源,如果没有匹配到,就走互联网npm地址;
    import url from 'url';
    import http from 'http';
    import gunzip from 'gunzip-maybe';
    import LRUCache from 'lru-cache';
    
    import bufferStream from './bufferStream.js';
    
    const npmRegistryURL =
      'http://10.250.4.121:8088' || 'https://registry.npmjs.org';
    
    
    const oneMegabyte = 1024 * 1024;
    const oneSecond = 1000;
    const oneMinute = oneSecond * 60;
    
    const cache = new LRUCache({
      max: oneMegabyte * 40,
      length: Buffer.byteLength,
      maxAge: oneSecond
    });
    
    const notFound = '';
    
    function get(options) {
      return new Promise((accept, reject) => {
        http.get(options, accept).on('error', reject);
      });
    }
    
    function isScopedPackageName(packageName) {
      return packageName.startsWith('@');
    }
    
    function encodePackageName(packageName) {
      return isScopedPackageName(packageName)
        ? `@${encodeURIComponent(packageName.substring(1))}`
        : encodeURIComponent(packageName);
    }
    
    async function fetchPackageInfo(packageName, log) {
      const name = encodePackageName(packageName);
      const infoURL = `${npmRegistryURL}/${name}`;
    
      log.debug('Fetching package info for %s from %s', packageName, infoURL);
    
      const { hostname, pathname,port } = url.parse(infoURL);
      const options = {
        hostname: hostname,
        path: pathname,
        port:port,
        headers: {
          Accept: 'application/json'
        }
      };
    
      const res = await get(options);
    
      if (res.statusCode === 200) {
        return bufferStream(res).then(JSON.parse);
      }
    
      if (res.statusCode === 404) {
        return null;
      }
    
      const content = (await bufferStream(res)).toString('utf-8');
    
      log.error(
        'Error fetching info for %s (status: %s)',
        packageName,
        res.statusCode
      );
      log.error(content);
    
      return null;
    }
    
    async function fetchVersionsAndTags(packageName, log) {
      const info = await fetchPackageInfo(packageName, log);
      return info && info.versions
        ? { versions: Object.keys(info.versions), tags: info['dist-tags'] }
        : null;
    }
    
    /**
     * Returns an object of available { versions, tags }.
     * Uses a cache to avoid over-fetching from the registry.
     */
    export async function getVersionsAndTags(packageName, log) {
      const cacheKey = `versions-${packageName}`;
      const cacheValue = cache.get(cacheKey);
    
      if (cacheValue != null) {
        return cacheValue === notFound ? null : JSON.parse(cacheValue);
      }
    
      const value = await fetchVersionsAndTags(packageName, log);
    
      if (value == null) {
        cache.set(cacheKey, notFound, 5 * oneMinute);
        return null;
      }
    
      cache.set(cacheKey, JSON.stringify(value), oneMinute);
      return value;
    }
    
    // All the keys that sometimes appear in package info
    // docs that we don't need. There are probably more.
    const packageConfigExcludeKeys = [
      'browserify',
      'bugs',
      'directories',
      'engines',
      'files',
      'homepage',
      'keywords',
      'maintainers',
      'scripts'
    ];
    
    function cleanPackageConfig(config) {
      return Object.keys(config).reduce((memo, key) => {
        if (!key.startsWith('_') && !packageConfigExcludeKeys.includes(key)) {
          memo[key] = config[key];
        }
    
        return memo;
      }, {});
    }
    
    async function fetchPackageConfig(packageName, version, log) {
      const info = await fetchPackageInfo(packageName, log);
      return info && info.versions && version in info.versions
        ? cleanPackageConfig(info.versions[version])
        : null;
    }
    
    /**
     * Returns metadata about a package, mostly the same as package.json.
     * Uses a cache to avoid over-fetching from the registry.
     */
    export async function getPackageConfig(packageName, version, log) {
      const cacheKey = `config-${packageName}-${version}`;
      const cacheValue = cache.get(cacheKey);
    
      if (cacheValue != null) {
        return cacheValue === notFound ? null : JSON.parse(cacheValue);
      }
    
      const value = await fetchPackageConfig(packageName, version, log);
    
      if (value == null) {
        cache.set(cacheKey, notFound, 5 * oneMinute);
        return null;
      }
    
      cache.set(cacheKey, JSON.stringify(value), oneMinute);
      return value;
    }
    
    /**
     * Returns a stream of the tarball'd contents of the given package.
     */
    export async function getPackage(packageName, version, log) {
      const tarballName = isScopedPackageName(packageName)
        ? packageName.split('/')[1]
        : packageName;
      const tarballURL = `${npmRegistryURL}/${packageName}/-/${tarballName}-${version}.tgz`;
    
      log.debug('Fetching package for %s from %s', packageName, tarballURL);
    
      const { hostname, pathname,port } = url.parse(tarballURL);
      const options = {
        hostname: hostname,
        path: pathname,
        port:port
      };
    
      const res = await get(options);
    
      if (res.statusCode === 200) {
        const stream = res.pipe(gunzip());
        // stream.pause();
        return stream;
      }
    
      if (res.statusCode === 404) {
        return null;
      }
    
      const content = (await bufferStream(res)).toString('utf-8');
    
      log.error(
        'Error fetching tarball for %s@%s (status: %s)',
        packageName,
        version,
        res.statusCode
      );
      log.error(content);
    
      return null;
    }
    

    修改npm.js完毕之后,执行npm run build重新生成server.js文件,然后启动服务:npm run start; 现在私库和公网npm都可以正常预览了

    Hel-micro

    文档地址: https://tnfe.github.io/hel/ 具体不详细说明啦,请参照作者文档使用

    接下来说一下Hel-micro + npm私服 + unpkg服务的一个落地实践

    假设我有A、B两个业务系统,那么A与B既是模块的使用者又是模块的提供者,既是0又是1??

    oh~有点复杂,我们先说0 1的情况吧,明白了0 1,1 0的相互转化也就为所欲为啦~

    A系统 => 模块提供者 B系统 => 模块消费者

    我们现在把作者提供的远程组件书写方法集成到了A系统,目前是直接放到了src下

    远程组件的书写方式可参照上边的文档连接

    A系统暴露的远程模块书写成功后,我们执行下如下命令

    HEL_APP_HOME_PAGE=http://10.250.4.121:9999/[email protected]/hel_dist npm run build
    
    • HEL_APP_HOME_PAGE是Hel-micro的参数
    • http://10.250.4.121:9999是unpkg私服的地址
    • [email protected]是包名称与版本号,都要跟package.json保持一直 打包完成后,执行发布命令
    npm publish
    

    注意用nrm检查下是否已经切换到自己私有的npm源了

    发布成功后,我们就可以在任意项目里面消费远程组件啦,包括在A项目

    消费方式

    假设我们要在B系统消费刚才A系统产生的模块,我们只需要修改一点点地方即可

    • 安装hel-micro
    hel-micro
    
    • 安装A系统刚才提供出的模块
    npm i note-comps
    
    • 改造main.js
    import { preFetchLib } from 'hel-micro'
    
    ;(async function() {
      // await preFetchLib('hel-tpl-remote-vue-comps');
    
      // 自定义前缀
      await preFetchLib('note-comps', {
        apiPrefix: 'http://10.250.4.121:9999'
      })
    
      // 调试本地开发中的远程组件
      // const enableCustom = !!window.location.port;
      // await preFetchLib('hel-tpl-remote-vue-comps', {
      //   custom: {
      //     host: 'http://localhost:7001', // 基于 web-dev-server 开发中生成产物联调
      //     // host: 'http://localhost:9001', // 基于 http-server 已构建好的产物联调
      //     enable: enableCustom,
      //   },
      // });
    
      import('./loadApp')
    })().catch((err) => {
      console.error('loadApp err: ', err)
    })
    
    

    http://10.250.4.121:9999是我们搭建的unpkg私服的地址

    • loadApp.js就是之前main.js里面的内容
    import Vue from 'vue'
    
    import App from './App'
    import store from './store'
    import router from './router'
    // import * as Sentry from '@sentry/vue'
    // import { BrowserTracing } from '@sentry/tracing'
    import i18n from './lang'
    
    import WujieVue from 'wujie-vue2'
    
    Vue.mixin(mixins)
    Vue.use(CzUI, {
      size: 'small',
      i18n: (key, value) => i18n.t(key, value)
    })
    
    Vue.use(WujieVue)
    
    // 预加载流程引擎和权限引擎
    const { setupApp, preloadApp } = WujieVue
    
    new Vue({
      el: '#app',
      router,
      store,
      i18n,
      render: (h) => h(App)
    })
    
    
    • 在组件里面使用
    <template>
      <div class="user-info">
        <div>
          <RemoteComp name="我是子模块" msg="子模块随时更新、部署驱动开发" />
        </div>
      </div>
    </template>
    
    <script>
    import comps from 'note-comps'
    export default {
      name: 'UserInfo',
      components: {
        RemoteComp: comps.Card // hi, remote component
      }
    }
    </script>
    
    

    至此,A系统的模块更新后发布后,其他系统的这个模块都会自动更新,那么B系统也可以随意往外暴露各种远程模块给各个系统调用啦。

    此时模块联邦就可以在不同系统中随意调度,但是还缺乏一个管控平台 目前我们是微模块 + 微前端配合食用的,具体食用方式,我们还会再出一篇文章详细介绍。

    documentation 
    opened by sunyuelei 3
Owner
腾讯TNTWeb前端团队
腾讯TNTWeb前端团队
腾讯TNTWeb前端团队
Micro Frontends - Module federation with Nx

juicy-mfe Module Federation을 이용한 Micro Frontend(마이크로 프론트엔드) 아키텍쳐 Monorepo 연습장 입니다. Explore the docs » View Demo · Report Bug · Request Feature Table o

juicyjusung 2 Nov 29, 2022
This is an example project to demonstrate how to use Nx, Next.js and Module Federation together.

Nextjs, Nx and Module Federation This is an example project to demonstrate how to use Nx, Next.js and Module Federation together. ⚠ This example depen

Bruno Silva 14 Nov 28, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
This SDK helps developers get started with the on-chain tools provided by Metaplex.

Metaplex JavaScript SDK ⛔️ DO NOT USE IN PRODUCTION, THIS SDK IS IN VERY EARLY ALPHA STAGES! This SDK helps developers get started with the on-chain t

Metaplex Foundation 263 Dec 27, 2022
🥁 Batch contract/on-chain queries to the same block. Multicall SDK for the Klaytn blockchain.

Klaytn Multicall Built for inevitable-changes/bento Inspired by makerdao/multicall and dopex-io/web3-multicall ?? Installation # Yarn yarn install kla

Inevitable (Bento) 4 Nov 7, 2022
chain-syncer is a module which allows you to synchronize your app with any ethereum-compatible blockchain/contract state. Fast. Realtime. Reliable.

Chain Syncer Chain Syncer is a JS module which allows you to synchronize your app with any ethereum-compatible blockchain/contract state. Fast. Realti

Miroslaw Shpak 10 Dec 15, 2022
GraphQL Hive provides all the tools the get visibility of your GraphQL architecture at all stages, from standalone APIs to composed schemas (Federation, Stitching)

GraphQL Hive GraphQL Hive provides all the tools the get visibility of your GraphQL architecture at all stages, from standalone APIs to composed schem

Kamil Kisiela 184 Dec 21, 2022
The iofod SDK provides developers with the ability to interact with the main iofod interface within the Web worker, enabling rapid development of iofod extensions through the SDK.

iofod-sdk English | 简体中文 The iofod SDK provides developers with the ability to interact with the main iofod interface within the Web worker, enabling

iofod, Inc. 47 Oct 17, 2022
Movehat is a TypeScript SDK for Move on Sui built on top of Sui's TypeScript SDK and our fork of Ian Macalinao's `move-ts`.

Movehat Movehat is a TypeScript SDK for Move on Sui built on top of Sui's TypeScript SDK and our fork of Ian Macalinao's move-ts. Movehat aspires to b

Pentagon 10 Sep 30, 2022
Lucid is a library, which allows you to create Cardano transactions and off-chain code for your Plutus contracts in JavaScript and Node.js.

Lucid is a library, which allows you to create Cardano transactions and off-chain code for your Plutus contracts in JavaScript and Node.js.

Berry 243 Jan 8, 2023
It's a javascript Class which contains utility methods that simplify working with google maps web SDK

About GoogleMapsJSHelper It's a javascript Class which contains utility methods that simplify working with google maps web SDK Note: i used ES7 Class

Sami Alateya 6 Jul 23, 2022
An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

Snyk Labs 57 Dec 28, 2022
Evmos chain

Evmos Evmos is a scalable, high-throughput Proof-of-Stake blockchain that is fully compatible and interoperable with Ethereum. It's built using the Co

Tharsis 1.4k Jan 3, 2023
On-chain defense against hostile takeovers

Poison pill On-chain defense against hostile takeovers. In layman's terms, this smart contract only facilitates a discounted sale of shares to a white

Michalis Kargakis 6 Jul 19, 2022
WAMpage - A WebOS root LPE exploit chain

WAMpage WAMpage - A WebOS root LPE exploit chain This exploit is mainly of interest to other researchers - if you just want to root your TV, you proba

David Buchanan 45 Dec 2, 2022
Nouns On-Chain Proposal Simulation and Analysis

Nouns Diligence Nouns On-Chain Proposal Simulation and Analysis For Voters Technical reports for all reviewed proposals can be found in the reports fo

Nouns 23 Dec 26, 2022
On-chain generative NFT collection

ETH Time ETH Time is a new NFT collection created to explore new ways of generating NFTs on-chain. It is inspired by existing projects such as Zora's

null 3 Feb 13, 2022