browserify / browserify Goto Github PK
View Code? Open in Web Editor NEWbrowser-side require() the node.js way
Home Page: http://browserify.org/
License: MIT License
browser-side require() the node.js way
Home Page: http://browserify.org/
License: MIT License
I am trying to use browserify as follows:
server.use(require('browserify')({
base: __dirname + '/js',
mount: '/browserify.js',
require: ['underscore', 'backbone']
}));
backbone contains this line (among others):
// For Backbone's purposes, either jQuery or Zepto owns the `$` variable.
var $ = this.jQuery || this.Zepto;
Which browserify is turning into:
// For Backbone's purposes, either jQuery or Zepto owns the `_browserifyRequire.modules["./lib/vendor/backbone"] = function () {
var module = { exports : {} };
var exports = module.exports;
var require = function (path) {
return _browserifyRequire.fromFile("./lib/vendor/backbone", path);
};
(function () {
variable.
var $ = this.jQuery || this.Zepto;
The dollar sign you are using in your regular expressions seems to be conflicting with jQuery somehow.
Hi there โ
I noticed that the Object.keys shim used by browserify has an unfiltered for-in loop, meaning that it is not compatible with the standard method, which returns only the keys of the object's own properties. I was going to fix it and offer a pull request, but then it occurred to me that the fix would require a shim for Object.prototype.hasOwnProperty, and so I decided to tell you guys about it instead, and maybe after some discussion we can fix it.
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
Regards,
Chris
using window.require() clashes with ace https://github.com/ajaxorg/ace.git
Hi, thank you for a best browser require module. I'm trying to port Nohm to browser using browserify and have some problems with it.
var connect = require('connect'); var server = connect.createServer(); server.use(connect.static(__dirname + '/www')); server.use(require('browserify')({ require: ['nohm'] })); server.listen(3000);
<head>
<script type="text/javascript" src="/browserify.js"></script>
<script type="text/javascript">
var nohm = require('nohm');
</script>
</head>
<body></body>
</html>
There are two errors:
Uncaught Error: Cannot find module 'util'
Uncaught Error: Cannot find module 'nohm/helpers'
nohm/helpers is required in nohm module like require(__dirname + '/helpers')
Please specify the direction of where to could be the problem. Thanks in advance.
Thank you for creating Browserify! I have been using it in my development workflow, but unfortunately quite quickly stumbled into the fact that Browserify loads and concatenates the source files only once (when the server starts). This is unfortunate within a development process. I would love to see Browserify be capable of reloading source files on each request.
To do so, I have moved the following line into the request function, which will make it reload the source files whenever a request is handled.
var src = exports.bundle(opts);
Of course, this is not a perfect solution, because bundle()
uses synchronous IO. But before I start making more invasive changes I wanted to bring this to your attention. Is this use case part of Browserify's goals? Do you have a solution in mind? I would be happy to contribute.
The README is good at showing you the files. It's not so good at saying what to do. A section or article that laid the basics would be good.
Here's what I've done (and what goes boom!):
The page does come up but nothing ever appears after "foo =" and no errors are generated in either FireFox or in the Console (aka command line/Terminal).
Suggestions?
I'm using quite a lot of complex javascript libraries on the client side.
An example: https://github.com/scottschiller/SoundManager2/blob/master/script/soundmanager2.js
Is it possible to make these libraries require-able?
Hi! I can't run basic example on my Macbook with Snow Leopard. Am I doing something wrong?
Ravbook:zaqpki2 rav$ node -v v0.4.1 Ravbook:zaqpki2 rav$ npm -v 0.3.18 Ravbook:zaqpki2 rav$ ls index.html js server.js Ravbook:zaqpki2 rav$ ls js bar.js baz.coffee foo.js Ravbook:zaqpki2 rav$ node server.js node.js:116 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Cannot find module 'es5-shim/package.json' at Function._resolveFilename (module.js:290:11) at Function.resolve (module.js:322:19) at Object.modules (/Users/Rav/.node_libraries/.npm/source/0.0.3/package/index.js:6:39) at Function.bundle (/Users/Rav/.node_libraries/.npm/browserify/0.3.1/package/index.js:42:26) at /Users/Rav/.node_libraries/.npm/browserify/0.3.1/package/index.js:11:23 at Object. (/Users/Rav/zaqpki2/server.js:5:32) at Module._compile (module.js:374:26) at Object..js (module.js:380:10) at Module.load (module.js:306:31) at Function._load (module.js:272:10)
https://github.com/kmiyashiro/backbone-browserify npm install backbone-browserify
Backbone is currently broken since it is wrapped in a closure and passed this
. Browserify then wraps it in another closure and doesn't pass it anything, thus the Backbone closure's this
is now {}
instead of window
. window
is used to grab window.jQuery or window.Zepto, which Backbone relies on.
I am trying the following:
server.use(browserify({
base: __dirname + '/js',
mount: '/browserify.js',
require: ['underscore', 'backbone', 'jquery', 'socket.io']
}));
Which fails with the following:
Error: Cannot find module 'mjsunit.runner'
at Function._resolveFilename (module.js:290:11)
at Function.resolve (module.js:322:19)
at Object.modules (/opt/local/lib/node/.npm/source/0.0.3/package/index.js:9:24)
at Function.wrap (/opt/local/lib/node/.npm/browserify/0.1.3/package/index.js:115:27)
at /opt/local/lib/node/.npm/browserify/0.1.3/package/index.js:79:31
at Array.map (native)
at Function.wrap (/opt/local/lib/node/.npm/browserify/0.1.3/package/index.js:76:27)
at /opt/local/lib/node/.npm/browserify/0.1.3/package/index.js:85:33
at Array.map (native)
at Function.wrap (/opt/local/lib/node/.npm/browserify/0.1.3/package/index.js:76:27)
Maybe because mjsunit.runner has a dot in the title of the module? I'm not sure. require('jquery')
works, it is only when I go to use jquery in browserify that I receive this error.
I would really love to be able to set http caching headers on the browserify response. It now has to resend every time.
Or am I missing something here?
Thanks for all the fantastic work btw!
i use a very simple app like this:
var express = require('express'),
browserify = require('browserify'),
app = express.createServer();
app.use(express.static(__dirname+'/public'));
app.use(express.bodyParser());
app.use(browserify({
require: [
'./client'
],
watch: true
}));
console.log('serving on :3001');
app.listen(3001);
client.js requires a few modules but nothing complicated.
whenever i change client.js or a related module and reload my web page i get the following message
Cannot find module './client'
[Break On This Error] throw new Error("Cannot find module '" + x + "'");
The only way to fix it seems to be to restart my node app which is really annoying!
Am I doing something wrong or is browserify not doing what I expect?
HI JAMES
I received a FATAL ERROR: JS Allocation failed - process out of memory
error when attempting to browserify https://github.com/harthur/glossary
steps to reproduce:
npm install -g browserify
npm install glossary
browserify --require glossary -o glossary.js
there don't appear to be any crazy symlinks hiding in my node_modules
thanks!
I don't use connect, no idea how to use browserify without it because all the examples use connect.
I am trying to get the uglifier working on my prod env this the code I wrote
can you tell me what's wron in it ?
var browserify = require('browserify')
, uglify = require('uglify-js')
var b = browserify({
require : ['./js/home.js']
, mount : "/home.js"
});
...
if (env == "production") {
b.register(uglify);
}
setTimeout
on most browsers comes with a minimum resolution of 5ms -- meaning that while setTimeout
will clear the stack as expected, it will also take a minimum of 5ms to call the provided callback. In Node, this isn't the case -- the callback will be called as soon as the stack is unwound. It may be worth incorporating something like this for browsers that support postMessage
so that they'll run process.nextTick
as fast as expected.
ran into a few problems with examples/simple (and the tests) after installing from npm.
Besides the require system, es5-shimming is needed to support a lot of node.js modules on all major browsers, without changing how code is written. Also only a few browsers support Function.prototype.bind() which is quite handy in Node.js. I'd like it if one of the first examples had shimming.
Also es5-shim.js is extra kilobytes that isn't always needed, and might make mobile sites a bit slower. How about a script that loads the whole file on demand? I wrote a draft of one, shiminy, that adds prototype.bind for ones that are close enough to what the shim enables otherwise, and loads the shim for ones that aren't. If the yepnope dependency could be removed, but the callback still available, I think it would be nice. Something like:
require('shiminy').shim(function() {
// code that enters into using node modules here
})
...or maybe just making sure it's loaded before the entry point.
just like head.js
That would be really great to be able to bundle.addPath("commons/lib") and allow your app to utilized code from that directory without making everything in it a browserify-compatible npm module.
If you specify the watch
option and set persistent: true
, the watch will happen only for a single change event. I believe it is because of how watch.js is coded:
fs.watchFile(file, wopts, function (curr, prev) {
if (curr.mtime - prev.mtime == 0) return;
watchedFiles.forEach(function(file, i) { // <-- Unconditionally remove the watch
fs.unwatchFile(file);
delete watchedFiles[i];
});
if (opts.verbose) {
console.log('File change detected, regenerating bundle');
}
opts.listen.removeListener('close', unwatch);
opts.listen.emit('change', file);
});
As you can see, it unconditionally removes the watch from all the files when a single event comes in. Instead, I think it should be something of this form:
fs.watchFile(file, wopts, function (curr, prev) {
if (curr.mtime - prev.mtime == 0) return;
if (!wopts.persistent) {
watchedFiles.forEach(function(file, i) {
fs.unwatchFile(file);
delete watchedFiles[i];
});
}
if (opts.verbose) {
console.log('File change detected, regenerating bundle');
}
opts.listen.removeListener('close', unwatch);
opts.listen.emit('change', file);
});
Any thoughts?
The method ignore() doesn't quite do what it promises.
Current Description: Omit a file or files from being included by the AST walk to hunt down require() statements.
Actual Description: Omit a file entirely.
What about a method that does NOT walk the AST, but still wraps the file? For example, I want to include jquery-browserify in my bundle, but there is no need to walk the AST for that entire source file because there are no require() statements in it.
My problem is that browserify takes FOREVER to walk the AST for these large libraries... all that CPU wasted. Any thoughts on how we can fix this?
I'm trying to figure out how I can replace jQuery that has been bundled by another package (node-jadeify) with jQuery from Google Ajax APIs. I tried bundle.ignore('jquery') and bundle.ignore('jquery-1.6.1.js') but neither worked. I'm not sure what bundle.ignore does.
I also tried adding my own jquery-1.6.1.js in hopes it would get used, that was just a stub (module.exports = window.jQuery). This is closer to ideal.
I think getting one file replaced might be a common problem - if it hasn't been documented before it might be worth documenting it.
Thanks!
The traverse module is installed, yet browserify can't seem to find it.
browserify --require traverse -o bundle.js
node.js:116
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Cannot find module "traverse" from directory "/Users/Alex/tmp"
at Function.<anonymous> (/usr/local/lib/node/.npm/browserify/1.4.0/package/lib/wrap.js:314:19)
at Function.require (/usr/local/lib/node/.npm/browserify/1.4.0/package/index.js:120:28)
at /usr/local/lib/node/.npm/browserify/1.4.0/package/bin/cli.js:88:16
at Array.forEach (native)
at Object.<anonymous> (/usr/local/lib/node/.npm/browserify/1.4.0/package/bin/cli.js:82:33)
at Module._compile (module.js:374:26)
at Object..js (module.js:380:10)
at Module.load (module.js:306:31)
at Function._load (module.js:272:10)
at Array.<anonymous> (module.js:393:10)
Node version 0.5.x supports AMD
http://nodejs.org/docs/v0.5.2/api/modules.html#aMD_Compatibility
As well as mocking out require
, exports
and module
, please mock out define
if this is already done, please document or mention it somewhere.
I use __dirname
a lot, especially in test files which may be executed from a project root directory or from time to time from executing the file directly. It would be helpful to add some sort of __dirname
support to browserify. Has this been considered? If not, I can fork & provide an implementation.
there is always an Uncaught Error: Cannot find module './foo'
When I to install browserify with npm and then start it, I get this spitting at me:
Error: Cannot find module 'connect'
at Function._resolveFilename (module.js:299:11)
at Function._load (module.js:245:25)
at require (module.js:327:19)
...
If i then "npm install connect" everything is fine. I suspect adding 'connect' to browserify's dependencies would be a good thing.
Hi!
I'm using browserify 0.5.2 and latest nodejs that I managed to pull today, which reports version v0.5.0-pre.
When I try to serve the crypto or hash modules, browserify fails, but it works with traverse for example.
The basic difference between the modules is that the package description for traverse contains a 'main' entry pointing to './index' in the package.json, while the others don't have it. The module crypto even has two different files to be loaded: md5.js and sha.js.
By what I could follow, it can't resolve the initial files that needed be loaded, failing with the following message:
Error: EBADF, Bad file descriptor 'crypto'
at Object.openSync (fs.js:221:18)
at Object.readFileSync (fs.js:112:15)
at Object.modules (/usr/local/lib/node/.npm/source/0.0.3/package/index.js:22:24)
at Function.wrap (/usr/local/lib/node/.npm/browserify/0.5.2/package/index.js:407:27)
at /usr/local/lib/node/.npm/browserify/0.5.2/package/index.js:290:35
at Array.map (native)
at Function.wrap (/usr/local/lib/node/.npm/browserify/0.5.2/package/index.js:275:27)
at Function.bundle (/usr/local/lib/node/.npm/browserify/0.5.2/package/index.js:138:24)
at /usr/local/lib/node/.npm/browserify/0.5.2/package/index.js:22:28
at Object. (/home/malheiro/Projects/KAW-trunk/KAW/node-server.js:252:32)
I am building an application where I need to have my modules loaded in from a relative path.
browserify gives the following error:
.replace(/\"./vendor/browserify/index"/g, function () {
**browserify.js:13726Uncaught SyntaxError: Unexpected token ILLEGAL
return JSON.stringify(libname)
})
Because only the first quote is escaped, but not any of the following special characters in the path. The path is correct, however.
Thanks.
Socket.io doesn't work right now because it uses module.parent.
Would it be possible to implement module.parent in Browserify?
With the removal of the base
option from browserify, I am trying to update my project to utilise the require
option instead.
Given the following structure...
/
/modules
entry.coffee
/a
a.coffee
/b
b.coffee
If entry
requires ./a/a
and a
requires ../b/b
then the following is thrown on requiring entry
Can only load non-root modules in a node_modules directory for file: /Users/pyrotechnick/webclient/modules/b/b.coffee
Similarly, when modules/b is nested within modules/a it throws the same error.
I don't think this is particularly easy to do well, but it would be nice for development.
I think this would need to do something weird for require, like adding script elements in to the dom or document.write()-ing them in.
I found that the fact that browserify wraps the entry code in a process.nextTick call causes issues with reloads. For example:
I have a page where I do 'window.MyObject = require('MyObject');'
If I add console.log to the generated browser-ified script, I can see that it has executed the process.nextTick call, but not the body of it yet. It does execute it eventually when the browser has finished loading some of the other JS files.
Is there any reason it is wrapped in process.nextTick rather than just (function(){ ...})()? If I make that change manually, it works great.
It would be nice to see browserify here: https://spreadsheets.google.com/lv?key=tDdcrv9wNQRCNCRCflWxhYQ
How to add a custom extension with register. I'm using the code below:
var bundle = browserify({
watch: true,
require: __dirname + '/app.js,
mount: '/public/javascripts/app.js',
});
bundle.register('.jst', template_compiler);
server.use(bundle);
At the time the bundle/wrap object is created the custom extension does not exist, when the following code is executed:
https://github.com/substack/node-browserify/blob/master/index.js#L89
Am I missing something?
Is this a browserify issue?
I've been trying to make the client-side javascript file of socket.io requirable.
Unfortunately, I've had little success.
Even simple (and not so good) methods like postpending module.exports = window.io;
do not work.
Has anyone attempted to do this? Any hints or feedback on how to achieve this is greatly appreciated.
Since the recursive require lookups, server startups are really slow
.
Could we cache the bundle in a tmpfile, so it's not computed unless any of the following
Usually npm-installed dependencies won't change, maybe have some specific flag for them.
Browserify doesn't look in NODE_PATH?
For example, I did npm -g install jquery-browserify
require('jquery-browserify')
in my client code does not work.
node-browserify is failing on this line:
with the following error:
Error: EISDIR, Is a directory
at Object.readSync (fs.js:238:19)
at Object.readFileSync (fs.js:104:19)
at Function.wrap (/Users/colin/Projects/ffloat/lib/vendor/browserify/index.js:98:22)
at /Users/colin/Projects/ffloat/lib/vendor/browserify/index.js:150:32
at Array.map (native)
at Function.wrapDir (/Users/colin/Projects/ffloat/lib/vendor/browserify/index.js:149:14)
at Function.bundle (/Users/colin/Projects/ffloat/lib/vendor/browserify/index.js:45:32)
at /Users/colin/Projects/ffloat/lib/vendor/browserify/index.js:10:23
at Server.<anonymous> (/Users/colin/Projects/ffloat/server.js:98:16)
at Server.configure (/Users/colin/Projects/ffloat/lib/vendor/express/lib/express/server.js:332:8)
When I have the Faker.js package installed. Faker.js
is what they name their folder. Changing the folder name to just Faker
(without the .js
clears up the issue.
Previously we could use the base option to specify a folder from which we could require any file in that folder. The functionality seems to be removed and the update broke our app.
How can we restore this functionality?
Hi,
I'm trying to get the npm example from your README working, and I'm having no luck. I've copied the code as is:
var connect = require('connect');
var server = connect.createServer();
server.use(connect.static(__dirname));
server.use(require('browserify')({
mount : '/browserify.js',
require : 'traverse',
}));
server.listen(4040);
console.log('Listening on 4040...');
Running this gives the following trace:
Error: Cannot find module "traverse" from directory "/Users/sen/Projects/Web"
at Wrap.require (/usr/lib/node/.npm/browserify/1.2.8/package/lib/wrap.js:314:19)
at /usr/lib/node/.npm/browserify/1.2.8/package/index.js:79:7
at Object.<anonymous> (/Users/sen/Projects/Web/test.js:5:32)
at Module._compile (module.js:383:26)
at Object..js (module.js:389:10)
at Module.load (module.js:315:31)
at Function._load (module.js:276:12)
at Array.<anonymous> (module.js:402:10)
at EventEmitter._tickCallback (node.js:108:26)
Here's my list of installed packages:
npm info using [email protected]
npm info using [email protected]
[email protected] active installed Browser-side require() for js directories and npm modules browser require middleware bundle npm coffee javascript
[email protected] active installed Wrap up expressions with a trace function while walking the AST with rice and beans on the side trace ast walk syntax sourc
[email protected] active installed Build chainable fluent interfaces the easy way... with a freakin' chainsaw! chain fluent interface monad monadic
[email protected] installed Unfancy JavaScript javascript language coffeescript compiler
[email protected] active installed Unfancy JavaScript javascript language coffeescript compiler
[email protected] active installed Compute the closest common parent for file paths common path directory file parent root
[email protected] active installed High performance middleware framework framework web middleware connect rack
[email protected] active installed Find all calls to require() no matter how crazily nested using a proper walk of the AST require source analyze ast
[email protected] active installed ES5 as implementable on previous engines
[email protected] active file fs installed path walk Higher level path and file manipulation functions.
[email protected] active installed Walk a directory tree. find walk directory recursive tree
[email protected] active installed Hash data structure manipulation functions hash object convenience manipulation data structure
[email protected] active installed Forgiving HTML/XML/RSS Parser in JS for *both* Node and Browsers
[email protected] active installed A javascript implementation of the W3C DOM dom w3c javascript
[email protected] active installed A web framework based on Knockout.js and Node.js
[email protected] active installed Leaner CSS css parser lesscss browser
[email protected] active installed A comprehensive library for mime-type mapping util mime
[email protected] active installed A really tiny functional JavaScript and async flow-control library
[email protected] active installed A package manager for node package manager modules install package.json
[email protected] active installed Uniqueness functions unique uniq uniqBy nub nubBy
[email protected] active installed querystring parser
[email protected] active http installed simple util utility Simplified HTTP request client.
[email protected] active installed A more hookable require.resolve() implementation resolve require node module
[email protected] active installed RightJS server-side version
[email protected] active installed The semantic version parser used by npm.
[email protected] active installed Chainable asynchronous flow control with sequential and parallel primitives and pipeline-style error handling flow-control
[email protected] installed Chainable asynchronous flow control with sequential and parallel primitives and pipeline-style error handling flow-control flow co
[email protected] active installed Grab all of the source files from a package
[email protected] installed Traverse and transform objects by visiting every node on a recursive walk
[email protected] active installed Traverse and transform objects by visiting every node on a recursive walk
[email protected] active installed JavaScript's functional programming helper library. util functional server client browser
I'd be very grateful if you could spot something simple I'm missing :)
Thanks,
Sean
Packing everying in one file causes some problems:
This is a feature request to add support (as a browserify option) for using asynchronous loading instead of packing everything in a single file.
This would solve all the problems described above: dev becomes easier, bandwidth is saved, and pages load faster (because scripts are loaded asynchronously).
Most node modules are currently using synchronous loading, but it would be possible to convert a script like that:
var http = require('http');
function doRequest() {
var url = require('url');
....
}
exports.doRequest = doRequest;
To something like this:
define(['http', 'url'], function(http, url) {
function doRequest() {
....
}
exports.doRequest = doRequest;
return exports;
});
Or even easier (just wrap the unmodified script with a header and footer):
define(['http', 'url'], function() {
// now that http and url modules are loaded, require('http') and require('url') can be used directly
// no need to modify the script :-)
var http = require('http');
function doRequest() {
var url = require('url');
....
}
exports.doRequest = doRequest;
return exports;
});
Such asynchronous modules can still be packed together in a single javascript file for reducing the number of HTTP requests in production.
This is done by just adding the module name as first argument of define
(define('moduleName', ['dependency'], func)
) and concatenating all modules.
Not sure what this error means:
# server.js:30
var SERVER = express.createServer();
# server.js:41
SERVER.use(browserify({
base: __dirname + '/lib',
mount: '/browserify.js',
require: [/*'underscore', 'backbone'*/]
}));
############### ############### ############## ##############
node.js:116
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Cannot set property 'maxListeners' of undefined
at EventEmitter.setMaxListeners (events.js:12:29)
at /opt/local/lib/node/.npm/browserify/0.3.6/package/index.js:14:8
at Object.<anonymous> (/Users/colin/Projects/ffloat/server.js:41:12)
at Module._compile (module.js:374:26)
at Object..js (module.js:380:10)
at Module.load (module.js:306:31)
at Function._load (module.js:272:10)
at Array.<anonymous> (module.js:393:10)
at EventEmitter._tickCallback (node.js:108:26)
If a module has a member that is the same name as the module itself, browserify fails on the client it seems.
Can anyone repro?
I'm trying to require coffee-script in my entry file and this is the error I'm getting:
DEBUG: Error: Cannot find module "system" from directory "/node_modules/coffee-script/lib"
at Wrap.require (/node_modules/browserify/lib/wrap.js:314:19)
at /node_modules/browserify/lib/wrap.js:377:14
at Array.forEach (native)
at Wrap.require (/node_modules/browserify/lib/wrap.js:376:27)
at /node_modules/browserify/lib/wrap.js:377:14
at Array.forEach (native)
at Wrap.require (/node_modules/browserify/lib/wrap.js:376:27)
at /node_modules/browserify/lib/wrap.js:124:14
at Array.forEach (native)
at Wrap.addEntry (/node_modules/browserify/lib/wrap.js:122:22)
Can't quite wrap my head around what's wrong, maybe you could shed some light on it Substack?
it looks like only the string form of "base" is supported in package.json, but it would be convenient for code re-use if this also worked with the object-style.
I had to add this to the devDependencies:
"underscore": "*",
"chainsaw":"*",
"dnode":"*",
"dnode-protocol":"*",
"jade":"*
and then re-npm link.
now that the tests are running, i am getting a failure with test/pkg/d not being found. could you add it to the repo?
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.