cif / handlebar-rider Goto Github PK
View Code? Open in Web Editor NEWWatch your handlebars template directories and precompile them to single file target
Watch your handlebars template directories and precompile them to single file target
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:10 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my'
20:54:14 Redis.1 | [12750] 20 Mar 20:54:14 - 2 clients connected (0 slaves), 557024 bytes in use
20:54:15 Admin_Handlebars.1 | [ OK ] Compiled 54 templates in "./js/templates/" to "./js/templates.js".
20:54:19 Redis.1 | [12750] 20 Mar 20:54:19 - 2 clients connected (0 slaves), 557024 bytes in use
20:54:24 Redis.1 | [12750] 20 Mar 20:54:24 - 2 clients connected (0 slaves), 557024 bytes in use
20:54:29 Redis.1 | [12750] 20 Mar 20:54:29 - 2 clients connected (0 slaves), 557024 bytes in use
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] File removed: 'js/templates/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 | [ Log ] New file detected: 'js/templates/my/dashboard.hb'
20:54:30 Admin_Handlebars.1 |
20:54:30 Admin_Handlebars.1 | /usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:114
20:54:30 Admin_Handlebars.1 | output.push(compiled);
20:54:30 Admin_Handlebars.1 | ^
20:54:30 Admin_Handlebars.1 | TypeError: Object (function(){var a=Handlebars.template,b=Handlebars.templates=Handlebars.templates||{};Handlebars.partials=Handlebars.templates,b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a(),b.landing=a(),b["my/dashboard"]=a(),b["manage/users/userTable"]=a()})() has no method 'push'
20:54:30 Admin_Handlebars.1 | at /usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:114:18
20:54:30 Admin_Handlebars.1 | at fs.js:252:14
20:54:30 Admin_Handlebars.1 | at Object.oncomplete (fs.js:93:15)
20:54:30 Admin_Handlebars.1 | exited with code 0
Ran into this today (right now, actually). I am going to add an option to SUPER-Minify the rendered HTML by removing the following characters:
\n
\r
\t
You should have learned by now that I just learned that HBR compiles the \t
's right into the HTML output (which is expected behavior, even though it took me by surprise). As I noticed this and am currently yelling profanity at my monitor, I am just going to go ahead and knock this out.
What do you think? Any other stuff that we can strip out in addition to these, or is there a really scary thing that's going to happen if we let people do this?
Here is just a taste of the glory I just found, straight from the page source:
\n\t\t\t\t\t\t\t\t\tGoogle\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="ten columns">\n\t\t\t\t\t\t\t\t\tMay access my:\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="activity-panel">\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="thirty columns">\n\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t<div class="twenty columns">\n\t\t\t\t\t\t\t\t\t\t<input class="privacy-slider" type="range" min="5" max="25" value="10">\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class="ten columns">\n\t\t\t\t\t\t\t\t\t\tCalendar\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="thirty columns">\n\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t<div class="twenty columns">\n\t\t\t\t\t\t\t\t\t\t<input class="privacy-slider" type="range" min="5" max="25">\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class="ten columns">\n\t\t\t\t\t\t\t\t\t\tAlbums/Songs\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="thirty columns">\n\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t<div class="twenty columns">\n\t\t\t\t\t\t\t\t\t\t<input class="privacy-slider" type="range" min="5" max="25" value="10">\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class="ten columns">\n\t\t\t\t\t\t\t\t\t\tBand Mates\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="thirty columns">\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="twenty columns">
Yep. Just.... Yep.
Here's the error. If I add the -r switch it compiles and watches just fine.
The command that fails
handlebar-rider -i ".\templates" -o ".\templates.js" -w
Environment
Windows 8 nodejs command prompt version 0.8.16
Error
at new JS_Parse_Error (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\n
ode_modules\uglify-js\lib\parse-js.js:260:22)
at js_error (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_module
s\uglify-js\lib\parse-js.js:268:15)
at parse_error (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_mod
ules\uglify-js\lib\parse-js.js:359:17)
at hex_bytes (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_modul
es\uglify-js\lib\parse-js.js:418:33)
at read_escaped_char (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\no
de_modules\uglify-js\lib\parse-js.js:407:59)
at C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_modules\uglify-j
s\lib\parse-js.js:445:51
at with_eof_error (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_
modules\uglify-js\lib\parse-js.js:581:32)
at read_string (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_mod
ules\uglify-js\lib\parse-js.js:425:24)
at Object.next_token [as input](C:UsersJoeAppDataRoamingnpmnode_moduleshandleb
ar-ridernode_modulesuglify-jslibparse-js.js:596:52)
at next (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_modules\ug
lify-js\lib\parse-js.js:706:37)
at subscripts (C:\Users\Joe\AppData\Roaming\npm\node_modules\handlebar-rider\node_modu
les\uglify-js\lib\parse-js.js:1169:25)
Verbose console output to demonstrate. Super weird. I'll look at this later.
01:42:48 Redis.1 | [8525] 28 Feb 01:42:48 - 2 clients connected (0 slaves), 557236 bytes in use
01:42:49 Handlebars.1 | [ OK ] Compiled 32 templates in "./js/templates/" to "./js/templates.js".
01:42:53 Handlebars.1 | [ Log ] File removed: 'js/templates/wall/post_text.hb'
01:42:53 Handlebars.1 | [ Log ] File removed: 'js/templates/wall/post_text.hb'
01:42:53 Redis.1 | [8525] 28 Feb 01:42:53 - 2 clients connected (0 slaves), 557236 bytes in use
01:42:54 Handlebars.1 | [ OK ] Compiled 62 templates in "./js/templates/" to "./js/templates.js".
01:42:58 Redis.1 | [8525] 28 Feb 01:42:58 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:04 Redis.1 | [8525] 28 Feb 01:43:03 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:09 Redis.1 | [8525] 28 Feb 01:43:09 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:14 Redis.1 | [8525] 28 Feb 01:43:14 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:19 Redis.1 | [8525] 28 Feb 01:43:19 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:23 Handlebars.1 | [ Log ] New file detected: 'js/templates/posts/comment.hb'
01:43:23 Handlebars.1 | [ Log ] New file detected: 'js/templates/posts/comment.hb'
01:43:24 Redis.1 | [8525] 28 Feb 01:43:24 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:24 Handlebars.1 | [ OK ] Compiled 64 templates in "./js/templates/" to "./js/templates.js".
01:43:29 Redis.1 | [8525] 28 Feb 01:43:29 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:34 Handlebars.1 | [ Log ] File change detected: 'js/templates/posts/comment.hb'
01:43:34 Redis.1 | [8525] 28 Feb 01:43:34 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:34 Handlebars.1 | [ OK ] Compiled 32 templates in "./js/templates/" to "./js/templates.js".
01:43:39 Handlebars.1 | [ Log ] File removed: 'js/templates/wall/post_comment.hb'
01:43:39 Handlebars.1 | [ Log ] File removed: 'js/templates/wall/post_comment.hb'
01:43:39 Redis.1 | [8525] 28 Feb 01:43:39 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:39 Handlebars.1 | [ OK ] Compiled 62 templates in "./js/templates/" to "./js/templates.js".
01:43:44 Redis.1 | [8525] 28 Feb 01:43:44 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts'
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts'
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts/text.hb'
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts/text.hb'
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts/comment.hb'
01:43:49 Handlebars.1 | [ Log ] File removed: 'js/templates/posts/comment.hb'
01:43:49 Handlebars.1 | [ Log ] New file detected: 'js/templates/post'
01:43:49 Handlebars.1 | [ Log ] New file detected: 'js/templates/post'
01:43:49 Redis.1 | [8525] 28 Feb 01:43:49 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:54 Redis.1 | [8525] 28 Feb 01:43:54 - 2 clients connected (0 slaves), 557236 bytes in use
01:43:57 Handlebars.1 | [ OK ] Compiled 248 templates in "./js/templates/" to "./js/templates.js".
tl;dr: This is awesome. I found a bug. I am fixing said bug. I will submit a pull request shortly.
The compiler fails when it hits an empty template file and leave the compiled template file output in an incomplete state.
[handlebar-rider] change detected to file, recompiling
[handlebar-rider] warning - deleted or now missing file
[handlebar-rider] compiled template directory ./js/templates/ to ./js/templates.js
I have forked handlebar-rider and am currently writing the fix. I will submit a pull request just as soon as I get some detection and error handling built in. ๐
P.S. Handlebar-rider is fucking AWESOME. Thank you so much for taking the time to write this. Literally no other framework or module that I've found (and that is a fucking lot, btw) does namespaced template names or accommodates subfolders. Even a popular framework called Mimosa allows you to have subfolders, but you have to name all your template files uniquely, regardless of where it is. Which destroys the whole purpose.
Loved this module, but it's not functioning now:
Error: bindAll must be passed function names
It seems that SuperCLI (which handlebar-rider is using) is causing this error.
According to
https://github.com/rex/SuperCLI
and
jashkenas/underscore#992
SuperCLI has been moved to rex-shell.
And underscore has updated its bindAll function (which SuperCLI is using).
Update handlebar-rider to use rex-shell instead of SuperCLI seems to solve the problem.
Creating milestone for this next part. I'm rewriting the entire module to utilize EventEmitter
, which is very much a Node thing and would even more dramatically improve the speed and performance of the module.
I have created a new branch for these changes, and hopefullly will have this done by today.
23:27:16 Handlebars.1 | [ Log ] File change detected: 'js/templates/msg/creation/user_placeholder.hb'
23:27:16 Handlebars.1 |
23:27:16 Handlebars.1 | /usr/lib/node_modules/handlebar-rider/node_modules/handlebars/lib/handlebars/compiler/parser.js:112
23:27:16 Handlebars.1 | throw new Error(str);
23:27:16 Handlebars.1 | ^
23:27:16 Handlebars.1 | Error: Parse error on line 2:
23:27:16 Handlebars.1 | ...ground-image: url({{hero) no-repeat top
23:27:16 Handlebars.1 | -----------------------^
23:27:16 Handlebars.1 | Expecting 'DATA', 'ID', got 'INVALID'
23:27:16 Handlebars.1 | at Object.parseError (/usr/lib/node_modules/handlebar-rider/node_modules/handlebars/lib/handlebars/compiler/parser.js:112:11)
23:27:16 Handlebars.1 | at Object.parse (/usr/lib/node_modules/handlebar-rider/node_modules/handlebars/lib/handlebars/compiler/parser.js:164:22)
23:27:16 Handlebars.1 | at Object.exports.attach.Handlebars.parse (/usr/lib/node_modules/handlebar-rider/node_modules/handlebars/lib/handlebars/compiler/base.js:15:28)
23:27:16 Handlebars.1 | at Object.exports.attach.Handlebars.precompile (/usr/lib/node_modules/handlebar-rider/node_modules/handlebars/lib/handlebars/compiler/compiler.js:1247:24)
23:27:16 Handlebars.1 | at precompile (/usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:86:25)
23:27:16 Handlebars.1 | at /usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:110:82
23:27:16 Handlebars.1 | at fs.readFile (fs.js:176:14)
23:27:16 Handlebars.1 | at Object.oncomplete (fs.js:297:15)
23:27:16 Handlebars.1 | exited with code 0
23:27:16 system | sending SIGTERM to all processes
I don't have the output in front of me, but the directory separators cause failures across the board. Will get output when possible.
The currently tagged version on npmjs is slightly older than the most recent changes that take care of preventing fatal errors. Could the npm package be updated with a bumped version for these changes. Right now, I include the github url when including handlebar-rider in my package.json
22:50:34 Admin_Handlebars.1 | [ Warning ] All files of the following types will be compiled: .hb, .hbs, .handlebars
22:50:34 Admin_Handlebars.1 |
22:50:34 Admin_Handlebars.1 | /usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:159
22:50:34 Admin_Handlebars.1 | throw error('There are no files for Handlebar-Rider to compile. Di
22:50:34 Admin_Handlebars.1 | ^
22:50:34 DataService.1 | Setting app mode to dev
22:50:34 Admin_Handlebars.1 | ReferenceError: error is not defined
22:50:34 Admin_Handlebars.1 | at readAndCompile (/usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:159:19)
22:50:34 Admin_Handlebars.1 | at readTemplatesDirectory (/usr/lib/node_modules/handlebar-rider/lib/handlebar-rider.js:35:30)
22:50:34 Admin_Handlebars.1 | at Object.oncomplete (fs.js:297:15)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.