GithubHelp home page GithubHelp logo

fecs's Introduction

FECS

FECS 是基于 Node.js 的前端代码风格工具。

Build Status Build Status NPM version Coverage Status Dependencies DevDependencies Greenkeeper badge

安装

    $ [sudo] npm install fecs -g

使用

    fecs
    fecs -v
    fecs check --help
    fecs format --help

更多参数见 wiki: CLI

API

fecs.leadName

设置或获取控制台输出信息前的名称,默认值为 fecs

var fecs = require('fecs');
fecs.leadName = 'edp';
...

fecs.getOptions(Array argv)

获取经 minimist 解释后的命令行参数对象,可用于 fecs.checkfecs.format 方法。

var options = fecs.getOptions(process.argv.slice(2));

console.log(options.command); // 'check'
...

fecs.check(Object options[, Function done])

检查文件或输入流的代码规范。

// 设置检查的文件路径
options._ = ['/path/to/check'];

// 或者设置为 stream
// options.stream = yourReadableStream;

// 设置文件类型
// options.type = 'js,css';


/**
 * callback after check finish
 *
 * @param {boolean} success true as all files ok, or false.
 * @param {Object[]} errors data for check result.
 */
function done(success, errors) {
    // blablabla
}

fecs.check(options, done);

fecs.format(Object options)

格式化、修复文件或输入流的代码。

fecs.check(options);

工具支持

常见问题

更多信息请访问 https://github.com/ecomfe/fecs/wiki

fecs's People

Contributors

chriswong avatar cxtom avatar dafrok avatar greenkeeper[bot] avatar ielgnaw avatar jinzhubaofu avatar junmer avatar l5oo00 avatar leeight avatar leuisken avatar marxjiao avatar meixg avatar niandalu avatar otakustay avatar oxund avatar phinome avatar xtx1130 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fecs's Issues

跳过@override的函数jsdoc检查

根据我们的规范,如果一个是继承自父类的重写,可以只有@override而忽略其它的jsdoc(虽然jsdoc不支持)

现在的fecs会对此类函数依旧去检查jsdoc是否合法而报错,是否可以检查如果函数的jsdoc有@override赗不作检查?

建议增加setImmediate到全局变量中

此函数为IE特有的函数,另外node.js从0.10版本开始使用此函数替代了原来的process.nextTick,很多计时器控件以及saber-promise均用到了此函数,建议增加到全局变量中

感觉htmlcs的配置没用

以下是.fecsrc文件:

{
    "htmlcs": {
        "viewport" false,
        "style-disabled": false
    }
}

以下是检查结果:

fecs  INFO message.html (16 messages)
fecs  WARN → line 49, col 5: Javascript contents are recommended to be imported in the tail of <body>.
fecs  WARN → line 56, col 9: Id should be unique in page.
fecs  WARN → line 58, col 9: Id should be unique in page.
fecs  WARN → line 60, col 9: Id should be unique in page.
fecs  WARN → line 62, col 9: Id should be unique in page.
fecs  WARN → line 64, col 9: Id should be unique in page.
fecs  WARN → line 66, col 9: Id should be unique in page.
fecs  WARN → line 68, col 9: Id should be unique in page.
fecs  WARN → line 70, col 9: Id should be unique in page.
fecs  WARN → line 72, col 9: Id should be unique in page.
fecs  WARN → line 74, col 9: Id should be unique in page.
fecs  WARN → line 76, col 9: Id should be unique in page.
fecs  WARN → line 78, col 9: Id should be unique in page.
fecs  WARN → line 80, col 9: Id should be unique in page.
fecs  WARN → line 82, col 9: Id should be unique in page.
fecs  WARN → line 9, col 5: Style tag can not be use.

最后一行表示不让我用<style>标签,但我应该禁用了规则的

Error warning when key: value has new line before value

Code below:

var foo = {
    x:
        "Along string which could possibly break max line length rule so it must be placed on a new line"
};

Triggers warning Extra space before value for key "x". which in my mind should be valid code

[fecs-key-spacing] 触发冒号对齐的计算导致误报过多

一般情况下,只要 key: value 中冒号前没有空格,会严格按照规范的 : 前不允许有空格,: 后必须带一个空格来检查。但是当 : 前出现空格时,将变成 : 对齐,虽然规则没有此条规定,但是此点对于代码可读性来说是有收益的,所以默认允许。

目前的问题主要在于,代码检查时新旧代码混杂,旧代码可能会在冒号前后都有空格,但是报错中只留下新代码相关,所以导致误报反馈较多。

考虑只有当冒号前有空格的次数达到一定比例才触发居于冒号对齐的计算。

AMD的factory应该排除

对于一个AMD模块,factory其实就相当于一整个文件,对这个函数检测语句数限制是不合理的

文件尾部多个空行报错

鉴于部分编辑器(如 VIM)的习惯,多个空行的情况允许存在,因此需要将规则 eol-last 定制修改为 fecs-eol-last,配置项中增加一个布尔值参数,为 true 时允许多个空行存在,否则表现同 eol-last,不允许多个空行。

增加对输出作过滤

两种方式:

  • 根据行号过滤

USAGE:

fecs --lines=80
fecs --lines='>20'
fecs --lines='(20, 80]' # >20 and <= 80
fecs --lines='<80'
fecs --lines='(20,80)' # > 20 and < 80
fecs --lines='10,>25' # == 10 or > 25
fecs --lines='(20,80], 120, 30,(5,10)' # > 20 and < 80 or == 120 or == 30 or > 5 and < 10

  • 根据校验规则名过滤

USAGE:

fecs --rules=dot-notation,fecs-indent
fecs --rules='dot-notation, fecs-indent'

需要确定指定规则不存在时的处理逻辑,只指定 eslint 规则时对 csshint 的处理逻辑。

  • 根据错误级别过滤

USAGE:

fecs --level=1
fecs --level=0

注意:由于 htmlcs 与 csshint/lesslint 的错误中没有 serverity 信息,并且 eslint 的规则配置的 serverity 并不能代表百度前端代码规范的错误等级,因此默认的 reporter 中根据错误级别过滤可能会不符合你的预期。

format工具格式化超长正则输出bug

代码中用2段超长正则

/**
 * mobileRegexp,正则匹配mobile,来源 http://detectmobilebrowsers.com/
 * @type {RegExp}
 */
 var mobileRegexp1 = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windowsce|xda|xiino/i.test(ua);
 var mobileRegexp2 = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|awa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck |ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id) |sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52| 53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(ua.substr(0,4));

format过后俩个正则都被叠加了

var mobileRegexp1 = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windowsce|xda|xiino/i./(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windowsce|xda|xiino/i.test(ua);
var mobileRegexp2 = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|awa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck |ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id) |sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52| 53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i./1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|awa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck |ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id) |sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52| 53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(ua.substr(0, 4));

正则中的空格

如下的正则会被检测为错误:

/^[^@#$%^&*?!+_ =~`:;"\'|\\<>,./\{\}\[\]\(\)]+$/

错误为:

Irregular whitespace not allowed

在正则中有空格我觉得是比较正常的事情,而且没有兼容性问题吧?

按冒号对齐的代码有时候提示错误

-webkit-flex-direction: column;

11 flex-direction: column;
RULE002--eagle
RULE002-[强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符。

fecsignore的策略?

我的.fecsignore是这样的:

!src/**
src/external/**

原意是:

  1. src下的不检查
  2. src/external下的不检查

然后我使用fecs会检查/下的以及output等目录下的

else前一定要换行吗

这个code:
if (typeof field.width !== 'undefined') {
columnsWidth.push(field.width);
} else {
columnsWidth.push(null);
}

会报这个错:
fecs WARN → line 404, col 19: Closing curly brace appears on the same line as the subsequent block.

需要写成:
if (typeof field.width !== 'undefined') {
columnsWidth.push(field.width);
}
else {
columnsWidth.push(null);
}

一定要这样吗?else 和闭花括号不换行也是一种常见的风格。我记得当时定的JS规范,这个好像是建议不是强制?

目录名为纯数字时报错

./fecs/node_modules/vinyl-fs/node_modules/glob-stream/index.js:73
if (positives.length === 0) throw new Error("Missing positive glob");
^
Error: Missing positive glob
at Object.gs.create (./fecs/node_modules/vinyl-fs/node_modules/glob-stream/index.js:73:39)
at Object.src (./fecs/node_modules/vinyl-fs/lib/src/index.js:27:23)
at Object.streams.files (./fecs/cli/check.js:32:19)
at Object.exports.run (./fecs/cli/check.js:73:48)
at Object.exports.parse (./fecs/lib/cli.js:100:30)
at Object. (./fecs/bin/fecs:4:5)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

  • 前面加 './' 或后面加 '/' 都可以避开

Bad indentation detection

Code below:

                    dialogAction.on(
                        'handlefinish',
                        function (e) {
                        }
                    );

Triggers error: "Bad indentation (24 instead 20)."

I don't see any indentation problem here

无法使用rgba属性

-webkit-box-shadow: 5px 5px 20px rgba(0, 0, 0, .6);

211 box-shadow: 5px 5px 20px rgba(0, 0, 0, .6);
RULE029--eagle
RULE029-[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb。不允许使用 rgb()

输出比较完成的路径

执行:fecs src/{ckeditor,common,encoding,mail,ui}


现在输出的内容是这样子的

fecs  INFO SimpleToggleButton.js (5 messages)

期望输出的内容是这样子的

fecs  INFO src/ui/SimpleToggleButton.js (5 messages)

fecs format 问题

fecs format 出现module rcloader 找不到,需要手动安装一下rcloader
另外 format 会删除掉原有代码的空行,无论是不是函数内空行还是外。

ESLint 某些规则报错位置不准确的修正

目前已知的规则有:

  • dot-notation (对应定位节点应为 node.property)
  • space-infix-ops (对应定位节点应为 node.right/node.consequent/node.alternate)
  • no-reserved-keys

需要做的步骤:

  1. 修复后内置,增加 fecs- 前缀;
  2. 去官方报 issues;
  3. 为官方发 PR 或待官方修复发布后移除内置实现,移除配置中相应的 fecs- 前缀。

考虑将所有配置合并到 package.json

目前 JSHint,JSCS 和 ESLint 都会自动读取 package.json 中相应的 xxxConfig 字段,避免项目内过多的 .xxxrc 配置文件。

大概流程为先从当前目录向上查找,以查找到第一个有 fecsConfig 字段的 package.json 为准,失败时则按现有流程读取 .fecsrc。

key-spacing 允许冒号对齐的方式

[强制] 在对象创建时,属性中的 : 之后必须有空格,: 之前不允许有空格。

虽然规范不允许 : 前出现空格,但是按 : 对齐更能提高可读性。

比如,设置了 key-spacing[2, {"beforeColon": false, "afterColon": true, "align": "colon"}] 后,在按冒号对齐时通过,全部不按冒号对齐,即冒号前都无空格时也通过。

由于 ESLint 在设置 align 为 colon 后,要求所有键值的 : 对齐,所以需要基于 ESLintkey-spacing 实现 fees-key-spacing

fecs会错误的忽略某些输入的文件

比如当我显示的指定需要检查某个文件的时候 fecs src/doc/Foobar.js,此时被忽略了,因为路径里面有 doc,这个是不符合预期的。

我认为如果我显示的指定需要检查某个文件,就不应该去考虑 .fecsignore 的配置了

@return 必须有描述吗?

大部分函数在@return有类型声明的时候就已经很明确返回值的含义(除非函数名乱写),我想一个md5(buffer)不需要写@return {Buffer} 输入的MD5值这么明确吧?

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.