Giter VIP home page Giter VIP logo

amd-optimize's Introduction

This project is no longer actively maintained. Mostly, because we use Webpack in our projects now. I am happy to review incoming PRs, though. If you would like to become maintainer, please contact me. โ€“ @normanrz

amd-optimize Build Status

An AMD (RequireJS) optimizer that's stream-friendly. Made for gulp. (WIP)

Features

  • Trace all dependencies of an AMD module
  • Stream-friendly: Pipe in files and get an ordered stream of files out. No need for writing on disk in between.
  • Support for precompilation of source files (ie. CoffeeScript)
  • Wraps non-AMD dependencies
  • Supply a custom loader for on-demand loading
  • Leaves concatenation and minification to your preferred choice of modules
  • gulp-sourcemaps support

Example

var gulp = require("gulp");
var amdOptimize = require("amd-optimize");
var concat = require('gulp-concat');

gulp.task("scripts:index", function () {

  return gulp.src("src/scripts/**/*.js")
    // Traces all modules and outputs them in the correct order.
    .pipe(amdOptimize("main"))
    .pipe(concat("index.js"))
    .pipe(gulp.dest("dist/scripts"));

});

Motivation

This aims to be an alternative to the powerful r.js optimizer, but made for a streaming environment like gulp. This implementation doesn't operate on the file system directly. So, there's no need for complicated setups when dealing with precompiled files. Also, this module only focuses on tracing modules and does not intend replace a full-fletched build system. Therefore, there might be tons of use cases where r.js is a better fit.

Installation

$ npm install amd-optimize

API

amdOptimize(moduleName, [options])

moduleName

Type: String

options.paths

paths : {
  "backbone" : "../bower_components/backbone/backbone",
  "jquery" : "../bower_components/jquery/jquery"
}

options.map

map : {
  // Replace underscore with lodash for the backbone module
  "backbone" : {
    "underscore" : "lodash"
  }
}

options.shim

shim : {
  // Shimmed export. Specify the variable name that is being exported.
  "three" : {
     exports : "THREE"
  },

  // Shimmed dependecies and export
  "three.color" : {
     deps : ["three"],
     exports : "THREE.ColorConverter"
  },

  // Shimmed dependencies
  "bootstrap" : ["jquery"]
}

options.configFile

Type: Stream or String

Supply a filepath (can be a glob) or a gulp stream to your config file that lists all your paths, shims and maps.

amdOptimize.src("index", {
  configFile : "src/scripts/require_config.js"
});

amdOptimize.src("index", {
  configFile : gulp.src("src/scripts/require_config.coffee").pipe(coffee())
});

options.findNestedDependencies

Type: Boolean
Default: false

If true it will trace require() dependencies inside of top-level require() or define() calls. Usually, these nested dependencies are considered dynamic or runtime calls, so it's disabled by default.

Would trace both router and controllers/home:

define("router", [], function () {
  return {
    "/home" : function () {
      require(["controllers/home"]);
    },
    ...
  }
})

options.baseUrl

options.exclude

options.include

options.wrapShim

Type: Boolean
Default: false

If true all files that you have declared a shim for and don't have a proper define() call will be wrapped in a define() call.

// Original
var test = "Test";

// Output
define("test", [], function () {
  var test = "Test";
  return test;
});

// Shim config
shim : {
  test : {
    exports : "test"
  }
}

options.preserveFiles

Type: Boolean
Default: false

If true all files that you combine will not be altered from the source, should be used for outputted files to match the original source file, good for debugging and inline sourcemaps. A good code minifier or uglify will remove comments and strip new lines anyway.

options.loader

WIP. Subject to change.

amdOptimize.src(
  "index",
  loader : amdOptimize.loader(
    // Used for turning a moduleName into a filepath glob.
    function (moduleName) { return "src/scripts/" + moduleName + ".coffee" },
    // Returns a transform stream.
    function () { return coffee(); }
  )
)

amdOptimize.src(moduleName, options)

Same as amdOptimize(), but won't accept an input stream. Instead it will rely on loading the files by itself.

Algorithms

Resolving paths

Finding files

  1. Check the input stream.
  2. Look for files with the default loader and baseUrl.
  3. Look for files with the custom loader and its transform streams.
  4. Give up.

Recommended modules

  • gulp-concat: Concat the output files. Because that's the whole point of module optimization, right?
var concat = require("gulp-concat");

gulp.src("src/scripts/**/*.js")
  .pipe(amdOptimize("index"))
  .pipe(concat("index.js"))
  .pipe(gulp.dest("dist"));
var uglify = require("gulp-uglify");

gulp.src("src/scripts/**/*.js")
  .pipe(amdOptimize("index"))
  .pipe(concat("index.js"))
  .pipe(uglify())
  .pipe(gulp.dest("dist"));
var coffee = require("gulp-coffee");

gulp.src("src/scripts/**/*.coffee")
  .pipe(coffee())
  .pipe(amdOptimize("index"))
  .pipe(concat("index.js"))
  .pipe(gulp.dest("dist"));
  • gulp-if: Conditionally pipe files through a transform stream. Useful for CoffeeScript precompilation.
var gif = require("gulp-if");

gulp.src("src/scripts/**/*.{coffee,js}")
  .pipe(gif(function (file) { return path.extname(file) == ".coffee"; }, coffee()))
  .pipe(amdOptimize("index"))
  .pipe(concat("index.js"))
  .pipe(gulp.dest("dist"));
var eventStream = require("event-stream");
var order = require("gulp-order");

eventStream.merge(
  gulp.src("bower_components/almond/almond.js"),
  gulp.src(amdOptimize("index"))
    .pipe(concat("index.js"))
)
  .pipe(order(["**/almond.js", "**/index.js"]))
  .pipe(concat("index.js"))
  .pipe(gulp.dest("dist"));

Current limitations

Tests

  1. Install npm dev dependencies npm install
  2. Install gulp globally npm install -g gulp
  3. Run gulp test

License

MIT ยฉ scalable minds 2014

amd-optimize's People

Contributors

beatgammit avatar c0 avatar dhill-rmn avatar jods4 avatar kirill-konshin avatar komputerwiz avatar lamflam avatar mlb6 avatar normanrz avatar typhonrt 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

amd-optimize's Issues

Example of configFile import

I'm not sure what I'm doing wrong as the documentation doesn't actually show a good example of using a config file. When running the following

gulp.task('amdoptimize', function() {
    amdOptimize.src("main.default", {
        configFile : "./configs/amd.json",
        baseUrl : "./js",
        dir:"./js/build"
    })
    .pipe(concat("main.default.js"))
    .pipe(gulp.dest("js/build"));
});

I get the following error. :'(

[16:58:23] Finished 'amdoptimize' after 11 ms
Error: No file for module 'jquery' found.
...

Here is my amd.json file.

({
    "paths": {
        "jquery": "//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min"
    },
    "map": {
        "*": {
            "facebook": "//connect.facebook.net/en_US/all.js",
            "facebook-debug": "//connect.facebook.net/en_US/all/debug.js"
        }
    },
    "config": {
        "version": {
            "libs/jquery/lazyload": "1.9.3",
            "libs/jquery/mobile": "1.4.0a1",
            "libs/jquery/numberformatter": "1.2.3",
            "libs/jquery/placeholder": "0.2.4",
            "libs/jquery/scrollbar": "0.2.4.custom",
            "libs/jquery/tablesorter": "2.0.5",
            "libs/jquery/wysibb": "1.5.1",
            "libs/jquery/ui/jquery.ui.core": "1.9.2",
            "libs/jquery/ui/jquery.ui.draggable": "1.9.2",
            "libs/jquery/ui/jquery.ui.mouse": "1.9.2",
            "libs/jquery/ui/jquery.ui.position": "1.9.2",
            "libs/jquery/ui/jquery.ui.slider": "1.9.2",
            "libs/jquery/ui/jquery.ui.touch-punch": "0.2.2"
        }
    }
})

Any idea what I'm doing wrong?

Support for gulp-sourcemaps

Great tool, but it would be very helpful if I could generate sourcemaps when using this tool. Do you plan to add support for sourcemaps?

Add module support

It would be nice to allow modules to be configued in the options so one task could just iterate over all modules instead of creating an individual task for each module.

"modules":[
        {"name":"main.tests"},
        {"name":"main.common"},
        {"name":"main.video"},
]

Windows messes slashes up

On Windows slashes get turned into backslashes. Module names in AMD require forward slashes though.

No Sourcemaps generated

The interaction with gulp-sourcemaps seems to fail silently. No source maps are generated. I'm using amd-optimize 0.2.5 and gulp-sourcemaps 1.2.4.

please add sugar syntax support for text plugin

I have a module like below:

define(['jquery',
'knockout',
'text!template1.html',
'text!template2.html',
'text!template3.html',
'text!template4.html',
'text!template5.html',
'text!template6.html'],function($, ko){

  var t1 = require('text!template1.html') 
})

after amd-optimize:

define(['jquery',
'knockout',
'template1.html',
'template2.html',
'template3.html',
'template4.html',
'template5.html',
'template6.html'],function($, ko){

  var t1 = require('text!template1.html') // error throwing
})

please add sugar syntax support for text plugin. Thanks!

r.js works but amd-optimize won't execute modules

I can't get amd-optimize to work properly, it loads my optimized file but won't run it. I've made a test project, see here.

My r.js setup

Config file:

({
    mainConfigFile: 'src/js/config.js',
    baseUrl: 'src/js',
    name: 'config',
    out: 'dist/js/global.js',
    removeCombined: true,
    findNestedDependencies: true,
    optimize: 'none'
})

It yields me the following diat/js/global-r.js:

define('modules/pinkifyer',[],function() {
    document.body.style.backgroundColor = 'pink';
});
define('modules/app',['require','./pinkifyer'],function(require) {
    require('./pinkifyer');
});
require.config({
    urlArgs: 'bust=' + (new Date()).getTime(),
    baseUrl: 'js',
    deps: ['modules/app']
    // deps: ['../dist/js/global.js']
});
define("config", function(){});

If I load in the index.html:

<script data-main="../dist/js/global" src="lib/require.js"></script>

It works, the only module, pinkifyer, makes sets the body bg to pink ๐Ÿผ

My amd-optimize setup

Here's my Gulp taks:

var gulp = require('gulp'),
    amdOptimize = require('amd-optimize'),
    concat = require('gulp-concat');

gulp.task('scripts', function() {
    gulp.src(['src/js/**/*.js'], { base: 'src/js' })
        // Traces all modules and outputs them in the correct order
        .pipe(amdOptimize('modules/app', {
            baseURL: 'src/js',
            configFile: 'src/js/config.js',
            findNestedDependencies: true
        }))
        .pipe(concat('global.js'))
        .pipe(gulp.dest('dist/js'))
});

And it yields dist/js/global.js:

define('modules/pinkifyer', [], function () {
    document.body.style.backgroundColor = 'pink';
});
define('modules/app', [
    'require',
    'exports',
    'module',
    'modules/pinkifyer'
], function (require) {
    require('./pinkifyer');
});

Contents of the config.js are missing from the optimized build results, and hence it wont work. Maybe I'm just doing something profoundly wrong here, quite new to RequireJS.

Allow remote scripts as dependency

In one of projects, we are required to use some third-party trackers, like google analytics.
With requirejs it is just possible to provide a config file aliasing them to some dependency in paths. That forces us to use full requirejs instead of almond because frequent changes in remote trackers could fail anything.
WIth amd-optimize, however, it fails when the remote script is in config.

I propose to replace aliases with full uri's from config and leave them to requirejs to handle.

Set module name in define

I have files:

app/file1.js
define([ 'dep1', 'dep2'], function() {...}

How I can get

app/file1.js
define('app/file1', [ 'dep1', 'dep2'], function() {...}

after amd-optimize processing?

Files resolved via paths confg don't get source maps.

I'm migrating a project that was using the require optimizer to amd-optimize. I've been struggling with a build that wasn't getting sourcemaps output and have tracked the problem down to files which get resolved via paths configuration.

My config looks something like this:

var amdConfig = {
    "baseUrl": "./target/js",
    "preserveFiles": true,
    "paths": {
        "class": "/lib/class-amd",
        "passwordstrength": "/lib/passwordstrength-amd",
        "jquery": "empty:",
    }
};

And my task looks more or less like this:

return gulp.src('target/js/**/*.js', { base: amdConfig.baseUrl })
    .pipe(sourcemaps.init())
    .pipe(amdOptimize("project-name/bootstrap", amdConfig))
    .pipe(concat('bootstrap.js'))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('./target/js/built'));

I found the problem by removing the concat line and noting that all files appeared to have sourcemaps. This lead me to thinking that perhaps a few files didn't so I inserted a debug log into gulp-sourcemaps to let me know if this was the case. It turns out that both class and password strength don't have sourcemaps associated. This leads to no files having sourcemaps after concat.

If I write a fix I'll PR it here. Just raising the bug here now in case you're more prepared to fix since you are more familiar with the code.

Thanks for the great project :).

Bug with shimmed dependensies

You add define to the end of simed file. F.e.

vendor.js

(function (global, factory) {
    ...
    return jQuery;
}));

//Add by amd-optimize
define('jQuery', [], function () {
    return;
});

I use compiled file with require.config (not the one that was used angular-amd)

require.config({
    baseUrl: '/app/',
    paths: {
        jquery: 'vendor',
        angular: 'vendor'
    }
    shim: {
        angular: ['jquery']
    }
}

It causes an error Uncaught TypeError: undefined is not a function. But it work if I move define section to top of vendor.js.

Move define sections to top of shimmed files.

gulp.watch - temporary working solution provided

Hi,

Great plugin! Please keep it going.

In case anybody is trying to get gulp.watch working with this plugin, I suggest that you resort to the following snippet:

process.on('uncaughtException', function (err) {
    console.log(err);
});    

There are many solutions which use gulp-plumber, gulp-watch, on('error') but I was not able to get any of these working. Please be aware that the following snippet will catch ANY exception, which may hide other problems.

Performance improvement

There is no problem if you use amdOptimize to build project. But I use this for styles compiling and livereload with gulp-watch and I watch a nasty delay.

I find style.less/style.sass/style.styl near every .js file (this allows not to download excess styles which are not relevant to the current project)

gulpWatch('project/**/*.styl', function() {
    return amdOptimize.src('/bootstrap', {configFile: configPath})
        .pipe(compileProjectStyles())
        .pipe(gulp.dest('build/project')));

amdOptimize scans scripts every time. Add, please, option cache: true which allows to use old scripts from cache

Question : Cannot read indexOf of undefined

Hi. When actually does this error happen ? I am sure I am missing something, But any suggestion on this will be highly appreciated.

/Users/nododo/https/files/public/UI/node_modules/amd-optimize/lib/trace.js:49
isText = moduleName.indexOf('text!') !== -1;
^
TypeError: Cannot read property 'indexOf' of undefined

Thanks

Use configFile.deps instead of moduleName

I find it too verbose if there is deps: ["index"] in configFile.

amdOptimize.src("index", {
  configFile : "src/scripts/require_config.js"
});

Better

amdOptimize.src({
  configFile : "src/scripts/require_config.js"
});

I also do not understand why do set files in gulp.src. In the gulp.src must specify only config file.

Much better

gulp.src("src/scripts/require_config.js")
    .pipe(amdOptimize())

Include example using bower

I haven't been able to figure out how to use bower in a requirejs project using gulp as the builder. I have the following structure:

  • src/
    • main.js
    • require.config.js - generated with bower-requirejs
  • bower_components/
    • reqwest

Here's my gulpfile.js:

var gulp = require('gulp'),
    concat = require('gulp-concat'),
    amdOptimize = require('amd-optimize'),
    bowerRequireJS = require('bower-requirejs');

gulp.task('default', function () {
    gulp.src(['src/main.js', 'bower_components/**/*.js'])
        .pipe(amdOptimize('main', {baseURL: 'src', configFile: 'src/require.config.js'}))
        .pipe(concat('main.js'))
        .pipe(gulp.dest('public'));
});

gulp.task('bower', function () {
    var options = {
        baseUrl: 'src',
        config: 'src/require.config.js',
        transitive: true,
    };

    bowerRequireJS(options, function (rjsConfigFromBower) {
        console.log('whatever');
    });
});

And here's my require.config.js generated from the 'bower' task:

require.config({
  shim: {

  },
  paths: {
    coordinator: "../bower_components/coordinator/coordinator",
    reqwest: "../bower_components/reqwest/reqwest"
  },
  packages: [

  ]
});

I've tried several different things and I've gotten the same error each time:

No file for module 'request' found

I feel that this is a pretty common problem and it would be fantastic to get an example that works. I have the same behavior working with Grunt, but I'd like to switch to gulp.

Is this something that should work with amd-optimize, or am I barking up the wrong tree?

Option to not modify the source contents file for development accuracy

I am using the module to work out which files are needed and to copy them into another build directory. The problem whilst debugging is that the output file does not exactly match the source file, because the escodegen generate method strips out new lines, and a bunch of other things.
For development it would make sense to have an option like preserveFiles that will not modify the file, so that the output contents ends up being the same as the source file.
I believe I see the fix but want to run it by you, perhaps there is another option that can be passed to the escodegen generate that I've not seen.
I'll send a pull request soon.
thanks

Excluding modules

We have a need to sometimes exclude dependencies from the optimised js file we produce, as they're already available in the page the file will go into.

I know the docs say that options.exclude isn't implemented, but I also noticed that there's a commit adding added deep and shallow exclusion.

Is it possible to have a dependency that isn't processed by amd-optimize, and so can be pulled in from the page the optimized js file is loaded into?

options.paths

requirejs.config can be like this:

baseUrl:"js/lib", 
paths: {
                page: '../page'
            }

use module js/page/frame.js :

require(['page/frame']);

but in the amd-optiomize options.paths like that it can't run

Error: No file for module 'page/frame' found.

so , them can't user same config ? or I use it error way?

define is not defined

Getting a define is not defined error.

Gulp:

return gulp.src('src/assets/js/*/')
// Traces all modules and outputs them in the correct order.
.pipe(amdOptimize("app", {
paths : {
"jquery" : "./bower_components/jquery/dist/jquery"
}
}))
.pipe(concat("app.min.js"))
.pipe(gulp.dest('build/assets/js/build'));


app.js

require([
'globals'
],function(){});


globals.js

define(['jquery'], function($) {
'use strict';

console.log('hello');

});

Change of behaviour of map in config between 0.2.7 and 0.2.8

In 0.2.5, config like below worked:

paths: {
'module_name': './bower_components/path_to/my_module'
},
map: {
'module_name': { 'jquery': 'jquery-1.9' }
}

However as of 0.2.8 (not sure about inbetween), the map seems to want the relative path rather than the module name, giving something like.

paths: {
'module_name': './bower_components/path_to/my_module'
},
map: {
'./bower_components/path_to/my_module': { 'jquery': 'jquery-1.9' }
}

Is this intended?

Add support for function(require, exports, module){} syntax

Currently code like

define(function(require, exports, module) {

    require('angular-ui-router');

    module.exports = require('angular').module('ui.router');

});

will be transformed into

define('contrib/angular-ui-router', [
    'angular-ui-router',
    'angular'
], function (require, exports, module) {
    require('angular-ui-router');
    module.exports = require('angular').module('ui.router');
});

Which obviously will cause errors.

I might be wrong, but it is supposed to be something like:

define('contrib/angular-ui-router', [
    'require', 'exports', 'module',
    'angular-ui-router',
    'angular'
], function (require, exports, module) {
    require('angular-ui-router');
    module.exports = require('angular').module('ui.router');
});

Simpler usage of Almond

You can simplify the documentation by adding the following:

var addSrc = require('gulp-add-src');
//...
            .pipe(amdOptimize('app', {...}))
            .pipe(addSrc.prepend(require.resolve('almond')))
            .pipe(addSrc.append('_start.js'))

where _start.js content is one-liner:

require('app'); // should match amdOptimize's first parameter

Prefix paths are not resolving properly

Using Bower & RequireJS, I have the following directory structure:

vendor/
    flight/
        component.js
        ....
scripts/
    common.js  (RequireJS config)
    app/
        core/
            component_ui/
                nav_drawer.js

In scripts/app/core/component_ui/nav_drawer.js, I have define(['flight/component'....
Just using RequireJS, this works because in my RequireJS config I have:

baseUrl: '/scripts/',
paths: {
    'flight': '../vendor/flight',
    ....
}

When I use amd-optimize like so:

amdOptimize.src('app/core/boot/main', {
    baseUrl: 'scripts',
    configFile: 'scripts/common.js'
})

I get the error:

Error: No file for module 'app/core/vendor/flight/component' found.

Preserving comments

Hi,

It appears that it is not currently possible to preserve comments whilst using amd-optimize.

Just looking briefly at the code, it appears as though they're not being captured and processed into the AST, or when processing the AST (via escodegen).

Is there an easy fix to this problem?

amd-optimize finding circular references when require.js isn't.

I have a project that is currently using Grunt and require.js and I am trying to move it over to gulp and amd-optimize.

The problem is that amd-optimize is breaking with a ' Circular dependency detected.' error.

Is there any reason why amd-optimize might return such an error when require.js doesn't when processing the same codebase.

An error occurred when require text file

Hi, Thanks for the cool plugin first.
I met a problem when I use amd-optimize.
My code is as follows:

define(function (require) {
    var userInfoTemplate = require('text!./templates/userinfo.tpl');
}

After building code is as follows:

define('admin/dashboard/templates/userinfo.tpl', [], function () {
    return 'Hello <%=name %>';
});
define('admin/dashboard/index', [
    'require',
    'exports',
    'module',
    'admin/dashboard/templates/userinfo.tpl'
], function (require) {
    var userInfoTpl = require('text!./templates/userinfo.tpl');
}

But the code after building can not be executed correctly.

require.js:166 Uncaught Error: Module name "text!admin/dashboard/templates/userinfo.tpl_unnormalized2" has not been loaded yet for context: _

If this line:

var userInfoTpl = require('text!./templates/userinfo.tpl');

can be converted to:

var userInfoTpl = require('admin/dashboard/templates/userinfo.tpl');

Then code will be executed correctly!

This is a bug? Or did I do something wrong?

Looking for a new maintainer

Thanks for your interest in this project. However, I am no longer actively maintaining this project. Mostly because we are now using Webpack for our builds.

I am happy to review incoming pull requests, but I won't implement new features.

If there is somebody who would like to become maintainer for this project, please contact me. Thanks!

Maintain Directory Structure

It'd be nice if it were possible for the tool to output files in the source directory structure.

For example I have

app
| Controllers
| + Controller1.js
| Directives
| + CustomDirective.js
| app.js

whenever I run them through the tool I get

Controller1.js
CustomDirective.js
app.js

I have a fairly large project and when navigating through the files outputted by the source map it'd be nice if that directory structure was preserved. I'm new to gulp so I'm afraid I don't know if this is possible or not.

Support CommonJS module definitions

It's clear on the readme that CommonJS module definitions are not supported, but this is actually a pretty important use case and is a barrier for adoption.

Is support for this on the roadmap?

loading order

define(['module1', 'module2', 'module3'], function() {
 ... 
});

Now modules and our dependensies load in correct order (as if the files are loaded synchronously):

module1.dep1.js
module1.dep2.js
module1.dep3.js
module1.js
module2.dep1.js
module2.dep2.js
module2.dep3.js
module2.js
module3.dep1.js
module3.dep2.js
module3.dep3.js
module3.js

This is useful in some cases.

You can guarantee the preservation of order in future versions? For example, to add syncLoading flag

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.