Coder Social home page Coder Social logo

phodal / mooa Goto Github PK

View Code? Open in Web Editor NEW
847.0 39.0 109.0 2.55 MB

Mooa 是一个为 Angular 服务的微前端框架。A independent-deployment micro-frontend Framework for Angular from single-spa.

Home Page: http://mooa.phodal.com/

License: Other

TypeScript 98.59% JavaScript 1.41%
spa angular micro-frontend microservices microframework microfrontends microservices-architecture

mooa's Introduction

Mooa

Build Status Coverage Status Maintainability node npm

A single SPA Utils for Angular 2+

Simliar Projects: https://github.com/worktile/ngx-planet (Production Ready)

based on single-spa && single-spa-angular-cli

difference:

  • Host <-> Apps Architecture
  • Configurable App (no loader require)
  • Independent App in Different Repo and runnable

Mooa Architecture

Examples: see in examples/

Online Demo:

  1. http://mooa.pho.im/ (host in AWS S3)
  2. http://mooa.phodal.com/ (host in GitHub Pages)

Features:

  1. SPA by Configurable file, ex: apps.json
  2. Pluggable APP
  3. support Child APP navigate
  4. CLI for Generate Config

Goal:

  1. 构建插件化的 Web 开发平台,满足业务快速变化及分布式多团队并行开发的需求
  2. 构建服务化的中间件,搭建高可用及高复用的前端微服务平台
  3. 支持前端的独立交付及部署

Usecase

If you are mooa, please provide you case to help this project.

Theory

Research and Application of Micro Frontends

Boilerplate

App Boilerplate: https://github.com/phodal/mooa-boilerplate

Usage

1. Install mooa

in Host and Child App

yarn add mooa

2. Config Host

  1. add get Apps logic in AppComponent (app.component.ts)
constructor(private renderer: Renderer2, http: HttpClient, private router: Router) {
  // config Mooa
  this.mooa = new Mooa({
    mode: 'iframe',
    debug: false,
    parentElement: 'app-home',
    urlPrefix: 'app',
    switchMode: 'coexist',
    preload: true,
    includeZone: true
  });
  http.get<IAppOption[]>('/assets/apps.json')
    .subscribe(
      data => {
        this.createApps(data);
      },
      err => console.log(err)
    );
}

private createApps(data: IAppOption[]) {
  data.map((config) => {
    this.mooa.registerApplication(config.name, config, mooaRouter.matchRoute(config.prefix));
  });

  this.router.events.subscribe((event) => {
    if (event instanceof NavigationEnd) {
      this.mooa.reRouter(event);
    }
  });

  return this.mooa.start();
}

3. Config App

  1. config App main.ts for load
import { mooaPlatform } from 'mooa';

if (environment.production) {
  enableProdMode();
}

mooaPlatform.mount('help').then((opts) => {
  platformBrowserDynamic().bootstrapModule(AppModule).then((module) => {
    opts['attachUnmount'](module);
  });
});
  1. setup app routing in app.module.ts
const appRoutes: Routes = [
  {path: '*', component: AppComponent}
  ...
];

@NgModule({
  declarations: [
    AppComponent,
    ...
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(
      appRoutes
    )
  ],
  providers: [
    {provide: APP_BASE_HREF, useValue: mooaPlatform.appBase()},
  ],
  bootstrap: [AppComponent]
})
export class AppModule {

}
  1. Add for handle URL Change in app.component.ts
constructor(private router: Router) {
  mooaPlatform.handleRouterUpdate(this.router, 'app1');
}

4. Setup apps.json with Mooa CLI

  1. install global cli
npm install -g mooa
  1. create URL list files

Examples: apps.txt

http://mooa.phodal.com/assets/app1
http://mooa.phodal.com/assets/help
  1. Generate Config File
mooa -g apps.txt

Examples:

[
  {
    "name": "app1",
    "selector": "app-app1",
    "baseScriptUrl": "/assets/app1",
    "styles": [
      "styles.bundle.css"
    ],
    "prefix": "app/app1",
    "scripts": [
      "inline.bundle.js",
      "polyfills.bundle.js",
      "main.bundle.js"
    ]
  }
]

Mooa Config

config in Host app's app.component.ts

this.mooa = new Mooa({
  mode: 'iframe',
  debug: false,
  parentElement: 'app-home',
  urlPrefix: 'app',
  switchMode: 'coexist'
}) 

mode: 'iframe'

use iframe as application container:

<app-home _nghost-c2="">
  <iframe frameborder="" width="100%" height="100%" src="http://localhost:4200/app/help/homeassets/iframe.html" id="help_206547"></iframe>
</app-home>

switchMode: 'coexist'

hidden application when inactive:

<app-home _nghost-c2="">
  <app-app1 _nghost-c0="" ng-version="5.2.8" style="display: none;"><nav _ngcontent-c0="" class="navbar"></app-app1>
  <iframe frameborder="" width="100%" height="100%" src="http://localhost:4200/app/help/homeassets/iframe.html" id="help_206547"></iframe>
</app-home>

For Angular Lazyload Module

inline.bundle.js will load script for / path.

So, just copy *.chunk.js files to dist/, then deploy it.

API

registerApplicationByLink

exmples:

mooa.registerApplicationByLink('help', '/assets/help', mooaRouter.matchRoute('help'));

registerApplication

mooa.registerApplication(config.name, config, mooaRouter.matchRoute(config.prefix));

hybrid

if (config.sourceType) {
  that.mooa.registerApplicationByLink(config.name, config.link, mooaRouter.matchRoute(config.name));
} else {
  that.mooa.registerApplication(config.name, config, mooaRouter.matchRoute(config.prefix));
}

navigateTo Custom App

mooaPlatform.navigateTo({
  appName: 'help',
  router: 'home'
});

License

Phodal's Idea

Copyright (c) 2013-2014 Christopher Simpkins Copyright (c) 2017-2018 Robin Coma Delperier

© 2018 A Phodal Huang's Idea. This code is distributed under the MIT license. See LICENSE in this directory.

mooa's People

Contributors

angular-cli avatar dependabot[bot] avatar phodal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mooa's Issues

Not able to find the latest version

Hey Phodal, I went through your article Micro-frontend Architecture in Action with six ways. I liked the article a lot. I went through mooa docs. When I saw the example. It looks like u upgraded the pages and mooa as well, but I check out the examples it looks like iframe version. Can you please help me I have 6 angular applications all deployed independently. I have to develop a shell where we can access the applications

mooa implemetation

Hi,

Please assist, trying to use mooa to Orchestrate 3 angular self-contained applications onto one application. Was unable to find clear documentation on the mooa framework. Please assist.

where do i put the following code?

this.mooa = new Mooa({
mode: 'iframe',
debug: false,
parentElement: 'app-home',
urlPrefix: 'app',
switchMode: 'coexist'
})

from step 4 i'm just lost

  1. Setup apps.json with Mooa CLI ...

不同业务模块之间如何发送通知

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[ ] Bug report  
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => Please do not submit support request here, instead see https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question

Current behavior

Expected behavior

Minimal reproduction of the problem with instructions

What is the motivation / use case for changing the behavior?

Environment


Angular version: X.Y.Z


Browser:
- [ ] Chrome (desktop) version XX
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX
 
For Tooling issues:
- Node version: XX  
- Platform:  

Others:

开发模式下主应用如何加载使用lazyload的子应用

For Angular Lazyload Module

inline.bundle.js will load script for / path.

So, just copy *.chunk.js files to dist/, then deploy it.

以上是针对生产环境环境下的配置,测试OK。如果是开发环境*.chunk.js需要拷贝到哪个目录,才能成功加载使用lazyload的子应用?

试用mooa框架出问题,window:mooa.bootstrapping事件不调用

您好,非常感谢分享前端分布式框架mooa,我看了下原理感觉非常好,试用了,如果照着例子写实例,运行没有什么问题,但是想融入我自己的框架感觉有点问题,我的框架有2层路由,我也是在app.component.ts(第一层路由)写的mooa加载和启动,在第二层子路由中注册了子模块加载的东西,如下:
{
path: 'app/:appName/:route',
component: DynamicContainerComponent
},
{
path: 'app/:appName',
component: DynamicContainerComponent
}
DynamicContainerComponent的作用就是您的Exexamples的home.component,子模块也是使用的app1,
但是运行调用子模块不行,监控后发现(window:mooa.bootstrapping)': 'loadingStart($event)没有执行,不知道什么原因?

关于微前端的一些探讨

Hi Phodal,

看了你的关于微前端的一些文章,《实施前端微服务化的六七种方式》《微前端快速选型指南》《【架构拾集】 微前端:微应用化》。

我们公司目前要做一个新的产品,计划使用微前端的架构,目前在探索阶段。

关于你说的微应用那块,其实我也比较想用这种,但是有一些疑问。

假如我们采用的vue框架,不同的模块用一个单独的vue应用实现,每个应用最后打包之后是一些css,js,和index.html,我怎么样把这些集成在那个主应用中呢?用iframe去加载这个index.html吗?这样不就还是Iframe的实现吗?

或者是说可能我没有get到您的点,能不能指点一下。

假如我有:

主应用

  • 子应用1
  • 子应用2
  • 子应用3

主应用和子应用都有业务代码,而且每一个都是SPA。

  1. 子应用怎么集成,并最终产品表现为同一个应用
  2. 主应用怎么路由到不同的子应用
  3. 子应用与子应用之间,主应用与子应用之间,怎么通讯

我就职于一家大型外企,前端工作两三年了。但是微前端这块还没有研究过,网上查资料,目前也没有什么很成熟的解决方案。看到您在这块有很深的研究以及实践,所以期望您能给出点意见或者建议。谢谢了。

关于主应用使用nginx部署后如何加载子应用问题

Hi phodal 想和您请教下关于主应用在部署后如何加载子应用问题
下面的步骤不确定是不是正常的加载流程

现有一个主应用A和一个子应用B
如果A已经使用nginx部署,现需要在A中加入B(默认A中页面导航列表已有B的导航)
例如A在部署环境中,部署的位置为/root/host/dist,下面是A加入B的步骤
1.Build B应用
2.在A应用/root/host/dist/assets/目录创建子应用目录B
3.将B应用dist里面的文件拷贝到/root/host/dist/assets/B/目录中
4.例如/root/host/目录有apps.txt文件,在apps.txt中写入B的路径
http://x.x.x.x/assets/B/
5.生成配置文件apps.json如下,但是B的应用的name和prefix为空
[
{
"name": "",
"selector": "app-root",
"baseScriptUrl": "/assets/B/",
"styles": [
"styles.ac89bfdd6de82636b768.bundle.css"
],
"prefix": "",
"scripts": [
"inline.487161648483f67d0373.bundle.js",
"polyfills.194f3db5c95bb635c66b.bundle.js",
"main.ca9f5cd21ebc06c1d73a.bundle.js"
]
}
]

这时候A加载B失败.

支持React

为啥不写个支持 React 的,我理解应该都差不多吧,或者设计的时候也支持多个框架,已插件形式扩展

Passing data on application startup

Hi,

Please advice how to pass data from parent application start-up with mooa.

Trying to do the following.

Parent applicatoin

const customProps: Test = new Test();
customProps.apikey = 'fasdfewafdsafdsfadsfasdf';
customProps.name = 'testing 123';
customProps.val1 = 'val1';
customProps.val2 = 'val2';

 that.mooa.registerApplicationByLink(config.name, config.link, mooaRouter.matchRoute(config.name), customProps);

customProps is the object i would like to pass to the other applications on start-up.

Child application

how can i get this object from the child application

e.g on the following code

mooaPlatform.mount('ficaVerificationFrontend').then((opts) => {

  console.log('--------- props start---------');
  console.log(opts);  // would like to access customProps obj at this point
  console.log('--------- props end---------');

  platformBrowserDynamic().bootstrapModule(AppModule)
    .then((module) => {
      opts['attachUnmount'](module);
      console.log('--------- attachUnmount start---------');
      console.log(module); // would like to access customProps obj at this point
      console.log('--------- attachUnmount end---------');
      // Do something with props if you want
      // Ex : module.instance.setSomething(...)
    })
    .catch(err => console.log(err));
})

几点疑问想请教一下

  1. 请问这个框架目前有在生产环境上使用过吗?
  2. 请问支持使用vue.js吗?我们部门统一的技术栈的vue.js,好像用不了这个。
  3. 我看了一下single-spa的demo,好像里面的common-dependencies特别大,不知道这个会怎样?
  4. 现在我有两个项目,里面有一些流程是基本一致的,想请教一下,适不适合用微服务来做。

其实主要就是想尝试一下微服务,感觉能解决不少前端的痛点,但是不清楚这个坑多不多。

标签重复插入及样式隔离问题

  1. 一个小问题: mooa.phodal.com 中,应用切换时 scriptstyle 标签重复插入了
  2. 请教一下,微前端系统中需要做样式隔离吗,因为很有可能某个子应用会覆盖全局样式,光靠规范无法保证,我们之前有尝试使用 shadow dom,但是 shadow dom 只能隔离 dom 和 样式, 不能隔离 js, 现在很多应用都是通过打包工具使用 js 创建全局 style 标签,还是会有可能冲突问题~

能否实现多个应用分开打包独立部署的场景?

目前业务里面有一些子服务分开独立用Webpack打包,然后在一个主工程里面根据路由去加载子应用,但是加载的是子应用其中的一个路由,这样请求的JS只是一些异步的chunk,不包含初始化加载的runtime,vendor,main等bunddle,这样就相当于将分开打包独立部署的子应用又要合并到一个主应用里面,实施起来发现复杂的场景下坑很多,并不够健壮,因为webpack打包时依赖是预先确定的,并无法动态改变,所以常常加载子应用的某个功能时会因为缺少依赖而报错,这种情况下是否有可解决方案呢?

新建子应用hell ,路由跳转过去报错

mooa.es5.js:545 Cannot mount hell because that is not bootstraped
(anonymous) @ mooa.es5.js:545
ZoneAwarePromise @ zone.js:891
mount @ mooa.es5.js:532
(anonymous) @ mooa.es5.js:736
step @ mooa.es5.js:55
(anonymous) @ mooa.es5.js:36
(anonymous) @ mooa.es5.js:29
ZoneAwarePromise @ zone.js:891
__awaiter @ mooa.es5.js:25
toMountPromise @ mooa.es5.js:723
(anonymous) @ mooa.es5.js:1204
step @ mooa.es5.js:55
(anonymous) @ mooa.es5.js:36
fulfilled @ mooa.es5.js:26
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:388
onInvoke @ core.js:16156
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:387
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.run @ zone.js:138
(anonymous) @ zone.js:872
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:421
onInvokeTask @ core.js:16147
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:420
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.runTask @ zone.js:188
drainMicroTaskQueue @ zone.js:595
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneTask.invokeTask @ zone.js:500
invokeTask @ zone.js:1540
globalZoneAwareCallback @ zone.js:1566
error (async)
customScheduleGlobal @ zone.js:1666
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:407
onScheduleTask @ zone.js:297
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:401
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleTask @ zone.js:232
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleEventTask @ zone.js:258
(anonymous) @ zone.js:1831
desc.set @ zone.js:1244
(anonymous) @ mooa.es5.js:290
ZoneAwarePromise @ zone.js:891
loadScriptPromise @ mooa.es5.js:282
(anonymous) @ mooa.es5.js:305
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:388
onInvoke @ core.js:16156
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:387
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.run @ zone.js:138
(anonymous) @ zone.js:872
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:421
onInvokeTask @ core.js:16147
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:420
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.runTask @ zone.js:188
drainMicroTaskQueue @ zone.js:595
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneTask.invokeTask @ zone.js:500
invokeTask @ zone.js:1540
globalZoneAwareCallback @ zone.js:1566
error (async)
customScheduleGlobal @ zone.js:1666
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:407
onScheduleTask @ zone.js:297
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:401
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleTask @ zone.js:232
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleEventTask @ zone.js:258
(anonymous) @ zone.js:1831
desc.set @ zone.js:1244
(anonymous) @ mooa.es5.js:290
ZoneAwarePromise @ zone.js:891
loadScriptPromise @ mooa.es5.js:282
(anonymous) @ mooa.es5.js:305
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:388
onInvoke @ core.js:16156
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:387
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.run @ zone.js:138
(anonymous) @ zone.js:872
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:421
onInvokeTask @ core.js:16147
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:420
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.runTask @ zone.js:188
drainMicroTaskQueue @ zone.js:595
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneTask.invokeTask @ zone.js:500
invokeTask @ zone.js:1540
globalZoneAwareCallback @ zone.js:1566
error (async)
customScheduleGlobal @ zone.js:1666
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:407
onScheduleTask @ zone.js:297
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.scheduleTask @ zone.js:401
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleTask @ zone.js:232
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.scheduleEventTask @ zone.js:258
(anonymous) @ zone.js:1831
desc.set @ zone.js:1244
(anonymous) @ mooa.es5.js:318
ZoneAwarePromise @ zone.js:891
(anonymous) @ mooa.es5.js:310
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:388
onInvoke @ core.js:16156
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invoke @ zone.js:387
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.run @ zone.js:138
(anonymous) @ zone.js:872
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:421
onInvokeTask @ core.js:16147
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneDelegate.invokeTask @ zone.js:420
push../node_modules/_zone.js@[email protected]/dist/zone.js.Zone.runTask @ zone.js:188
drainMicroTaskQueue @ zone.js:595
push../node_modules/_zone.js@[email protected]/dist/zone.js.ZoneTask.invokeTask @ zone.js:500
invokeTask @ zone.js:1540
globalZoneAwareCallback @ zone.js:1566
core.js:14597 ERROR Error: Uncaught (in promise): Error
Error
at mooa.es5.js:744
at step (mooa.es5.js:55)
at Object.throw (mooa.es5.js:36)
at rejected (mooa.es5.js:27)
at

child application css not rendering

Hi,

Please assist. It looks like the css for child applications does not render. I have applied css styles to a child application but it does not render the css.

looking forward to your response.

Recovering from failure.

Hi,

It seems as if the child applications cannot reload when they fail. How can i ensure that the applications can load again when they fail?

How can the child applications recover from failure when they load.

Highly appreciate your assistance.

The serve command requires to be run in an Angular project, but a project definition could not be found.

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[ ] Bug report  
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => Please do not submit support request here, instead see https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question

Current behavior

Expected behavior

Minimal reproduction of the problem with instructions

What is the motivation / use case for changing the behavior?

Environment


Angular version: X.Y.Z


Browser:
- [ ] Chrome (desktop) version XX
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX
 
For Tooling issues:
- Node version: XX  
- Platform:  

Others:

这是一个点赞issue

看了这个项目的介绍之后,是不是可以称之为前端的zookeeper?
另外,设计上,基座是需要区分于各个app独立部署来提供服务的吧?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.