Coder Social home page Coder Social logo

formdata's Introduction

Note: FormData is built in to NodeJS v18 globally so that you no longer need this.

A FormData polyfill for the browser ...and a module for NodeJS (New!)

npm install formdata-polyfill

The browser polyfill will likely have done its part already, and i hope you stop supporting old browsers c",)
But NodeJS still lacks a proper FormData
The good old form-data package is a very old and isn't spec compatible and does some abnormal stuff to construct and read FormData instances that other http libraries are not happy about when it comes to follow the spec.

The NodeJS / ESM version

  • The modular (~2.3 KiB minified uncompressed) version of this package is independent of any browser stuff and don't patch anything
  • It's as pure/spec compatible as it possible gets the test are run by WPT.
  • It's compatible with node-fetch.
  • It have higher platform dependencies as it uses classes, symbols, ESM & private fields
  • Only dependency it has is fetch-blob
// Node example
import fetch from 'node-fetch'
import File from 'fetch-blob/file.js'
import { fileFromSync } from 'fetch-blob/from.js'
import { FormData } from 'formdata-polyfill/esm.min.js'

const file = fileFromSync('./README.md')
const fd = new FormData()

fd.append('file-upload', new File(['abc'], 'hello-world.txt'))
fd.append('file-upload', file)

// it's also possible to append file/blob look-a-like items
// if you have streams coming from other destinations
fd.append('file-upload', {
  size: 123,
  type: '',
  name: 'cat-video.mp4',
  stream() { return stream },
  [Symbol.toStringTag]: 'File'
})

fetch('https://httpbin.org/post', { method: 'POST', body: fd })

It also comes with way to convert FormData into Blobs - it's not something that every developer should have to deal with. It's mainly for node-fetch and other http library to ease the process of serializing a FormData into a blob and just wish to deal with Blobs instead (Both Deno and Undici adapted a version of this formDataToBlob to the core and passes all WPT tests run by the browser itself)

import { Readable } from 'node:stream'
import { FormData, formDataToBlob } from 'formdata-polyfill/esm.min.js'

const blob = formDataToBlob(new FormData())
fetch('https://httpbin.org/post', { method: 'POST', body: blob })

// node built in http and other similar http library have to do:
const stream = Readable.from(blob.stream())
const req = http.request('http://httpbin.org/post', {
  method: 'post',
  headers: {
    'Content-Length': blob.size,
    'Content-Type': blob.type
  }
})
stream.pipe(req)

PS: blob & file that are appended to the FormData will not be read until any of the serialized blob read-methods gets called ...so uploading very large files is no biggie

Browser polyfill

usage:

import 'formdata-polyfill' // that's it

The browser polyfill conditionally replaces the native implementation rather than fixing the missing functions, since otherwise there is no way to get or delete existing values in the FormData object. Therefore this also patches XMLHttpRequest.prototype.send and fetch to send the FormData as a blob, and navigator.sendBeacon to send native FormData.

I was unable to patch the Response/Request constructor so if you are constructing them with FormData then you need to call fd._blob() manually.

new Request(url, {
  method: 'post',
  body: fd._blob ? fd._blob() : fd
})

Dependencies

If you need to support IE <= 9 then I recommend you to include eligrey's blob.js (which i hope you don't - since IE is now dead)

Updating from 2.x to 3.x

Previously you had to import the polyfill and use that, since it didn't replace the global (existing) FormData implementation. But now it transparently calls _blob() for you when you are sending something with fetch or XHR, by way of monkey-patching the XMLHttpRequest.prototype.send and fetch functions.

So you maybe had something like this:

var FormData = require('formdata-polyfill')
var fd = new FormData(form)
xhr.send(fd._blob())

There is no longer anything exported from the module (though you of course still need to import it to install the polyfill), so you can now use the FormData object as normal:

require('formdata-polyfill')
var fd = new FormData(form)
xhr.send(fd)

Native Browser compatibility (as of 2021-05-08)

Based on this you can decide for yourself if you need this polyfill.

screenshot

This normalizes support for the FormData API:

  • append with filename
  • delete(), get(), getAll(), has(), set()
  • entries(), keys(), values(), and support for for...of
  • Available in web workers (just include the polyfill)

formdata's People

Contributors

adamscybot avatar anddoutoi avatar bobbyg603 avatar ctjhoa avatar d11wtq avatar elcarim5efil avatar erikwiffin avatar geopjr avatar glebm avatar greenkeeper[bot] avatar jimmywarting avatar lummish avatar marlun78 avatar mr-squirrel avatar negezor avatar rohit-gohri avatar tremby avatar visualjerk 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

formdata's Issues

as file name is Blob in IE

if i append File to FormData and after get filename

formdata.get("file").name

i get Blob

...
i found

if (!window.FormData || !window.FormData.prototype.keys) {
  var x = function(b, a, d) {
      if (2 > arguments.length)
        throw new TypeError(
          "2 arguments required, but only " + arguments.length + " present."
        );
      return a instanceof Blob
        ? [
            b + "",
            a,
            void 0 !== d
              ? d + ""
              : "File" === Object.prototype.toString.call(a).slice(8, -1)
                ? a.name
                : "Blob"
          ]
        : [b + "", a + ""];
    },

i print value of param a is [object File], but Object.prototype.toString.call(a) is [object Blob]

if return change to

return a instanceof Blob
        ? [
            b + "",
            a,
            void 0 !== d
              ? d + ""
              : a.name
          ]
        : [b + "", a + ""];

and i get real name

Don't require _blob(), or suggest workaround in readme

I'm using fetch (no polyfill, haven't "fixed" it -- don't know how and don't see any docs on that), and sending body: formData. This was working natively in Chrome and Firefox and Safari, but I wanted the FormData polyfill so that I could use formData.delete and the other methods. After installing the polyfill, the fetch no longer worked in Safari: it was sending the string [object FormData] rather than the actual data. I realized after reading the docs again that I needed to use body: formData._blob().

This is a shame, since it means I can't selectively activate the polyfill, only when needed, while leaving my source code alone.

  1. Is there no way for this polyfill to serialize itself as the blob when required, in effect transparently calling its _blob method, so that no code change is needed?
  2. Failing that, may I suggest a note in the readme recommending code such as I'm using now, which is body: formData._blob ? formData._blob() : formData?

Angular

Hi,
I've tried to use your polyfill on my Angular app (version 5 as of now) and I had partial success.
It works great on Android devices, Chrome and IE on Windows 10. but on IOS IPhone it did not go well and also on Internet Explorer version 11 on Windows 7 had similar issue.
The functions has() , append() etc. work well.
The issue is with the post action.
There i get an error.
I've been trying to get my head around it and had no luck.
Can you give me an advise maybe?
Thanks.

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on all branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because it uses your CI build statuses to figure out when to notify you about breaking changes.

Since we didn’t receive a CI status on the greenkeeper/initial branch, it’s possible that you don’t have CI set up yet. We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

If you have already set up a CI for this repository, you might need to check how it’s configured. Make sure it is set to run on all new branches. If you don’t want it to run on absolutely every branch, you can whitelist branches starting with greenkeeper/.

Once you have installed and configured CI on this repository correctly, you’ll need to re-trigger Greenkeeper’s initial pull request. To do this, please delete the greenkeeper/initial branch in this repository, and then remove and re-add this repository to the Greenkeeper App’s white list on Github. You'll find this list on your repo or organization’s settings page, under Installed GitHub Apps.

Select elements where the option is both selected and disabled are included in FormData

In Chrome, FF and Safari the FormData does not include select elements where the option value is both selected and disabled (e.g. <option selected disabled value="0">Please choose one</option>)

This is because these values should not be submitted with the form as per the spec.

Currently the polyfill behaviour is that it only checks the selected value of the option rather than checking the disabled value as well.

Can I suggest changing line 130 of FormData.js to the following?
!opt.disabled && opt.selected && this.append(elm.name, opt.value)

Cheers

Blobs not being sent

It seems that you normalize all Blob objects to File objects, but then in _blob() you check if they are still Blobs. The result (on Safari, at least) is that since File is not an instance of Blob, they get encoded as simple form fields i.e. their content does not get encoded.

The best way to solve this in my opinion is to not try to accommodate the native "File" option, but instead always use the File wrapper fallback that you have. Meaning, instead of using try/catch to check if native file is present, you always define "BlobWrapper" and use that to wrap the blobs - and not call it "File".

this also takes care of problems arising when other polyfills rewrite the functionality of File (which is the case for my deployment where File object is filled in by cordova-plugin-file), making it a lot safer and more widely applicable.

Support Node.js environment

In Node.js (in --experimental-modules mode, not that it's relevant to the issue):

import 'formdata-polyfill'

Results in:

ReferenceError: Blob is not defined
    at [redacted]/node_modules/formdata-polyfill/formdata.min.js:9:425
    at Object.<anonymous> ([redacted]/node_modules/formdata-polyfill/formdata.min.js:17:3)

Add File Upload support to README

I can't find what are the file upload supported IE versions, so I think it would be nice to list on README what IE versions will be able to upload files, something like that:

  • IE6: FormData - file upload disabled
  • IE8: FormData - file upload through iframe and blob.js
  • IE10: FormData - file upload with FormData

That's not real data, but something like that or a table would be nice.

Shim global?

Would be convenient.

if (typeof window.FormData ==='undefined' || typeof window.FormData.prototype.get === 'undefined') {
  window.FormData = FormDataPolyfill;
}

karma testing

Should implement some testing.
preferable with karma and headless browsers.

FormData Object on IOS Safari sw worker

On IOS, service worker side, when using fetch and sending formData() it sends it as [FormData Object].

fetch(url, {
  method: 'POST',
  body: formData,
  credentials: "same-origin",
  headers: {
    'X-Requested-With':'XMLHttpRequest'
  }
})

When sending formData._blob, it send file, but there is more items appended to formData Object.

Any workaround?

_

.my fault please delete

new File fails on ie 11.0.15 / safari

The following line will fail on ie :

value = new File([value], filename

gives

Object doesn't support this action

as it doesn't have a constructor in IE

Boundary includes uppercase. Chrome always lowercases Blob.type.

I'm running into issues using this Polyfill to upload files in Chrome (possibly all WebKit). The server (a Rack server in Ruby) complains that the response is invalid, since it cannot find any multipart boundaries. A EOFError is raised during request body parsing.

It turns out this is due to the following code:

https://github.com/jimmywarting/FormData/blob/master/FormData.js#L227

Which looks completely correct to me, however, in Chrome this causes the request body to use uppercase + lowercase characters, while the actual content type of the generated Blob is forced to lowercase, thus producing an invalid request. I was able to fix this by simply patching FormData to only use a lower case boundary.

Notice the console.log output of the Blob itself and the contents of the Blob.

image

Referencing FormData from Safari webworker from a production build

Hi,

I have generated a test application on GitHub @ https://github.com/dcs3spp/Angular-WebWorker-Temp for the following query.

This is a quick temporary Angular CLI project that references FormData in a web worker (webworker/worker.js). Chromium and Firefox allow the use of FormData for sending multipart form data. However, Safari does not appear to allow this.

Subsequently, I have installed the formdata-polyfill and am struggling to import the polyfill from a production build.

I have referenced formdata-polyfill in the polyfills.ts file:

import 'formdata-polyfill/formdata.min';

When triggering a production build (ng build --prod) angular polyfills, including formdata-polyfill, are generated with a hash, e.g. polyfills.8cc9cadb24fdd97af199.js.

This is located in a script tag within index.html. However, the Web Worker still does not recognise the reference to FormData.

Does this mean that I have to use an importScripts statement within the Web Worker to import the polyfill generated by Angular CLI? If so, how can I achieve this from a production build when the chunk hash is dynamically generated per build?

Cheers

dcs3spp

This lib contains const and arrow function

I use this formdata and webpack2.
When I build my application with webpack, the message "unexpaced token (>) " is show up.
and I realize that this library contains const and array function, so I have to add additional code to webpack.

    rules: [
        {
            test: /\.js$/,
            exclude: /node_modules(?!\/formdata-polyfill)/,    <-- here 
            use: [{
                loader: 'babel-loader',
                options: {
                    presets: [['es2015', {modules: false}], 'react'],
                    plugins: ["syntax-dynamic-import"]

                },
            }]

        },

please tag your releases

It's crucial to be able to review what has changed since previous release.

Thank you,
Jérémy

Version 10 of node.js has been released

Version 10 of Node.js (code name Dubnium) has been released! 🎊

To see what happens to your code in Node.js 10, Greenkeeper has created a branch with the following changes:

  • Added the new Node.js version to your .travis.yml

If you’re interested in upgrading this repo to Node.js 10, you can open a PR with these changes. Please note that this issue is just intended as a friendly reminder and the PR as a possible starting point for getting your code running on Node.js 10.

More information on this issue

Greenkeeper has checked the engines key in any package.json file, the .nvmrc file, and the .travis.yml file, if present.

  • engines was only updated if it defined a single version, not a range.
  • .nvmrc was updated to Node.js 10
  • .travis.yml was only changed if there was a root-level node_js that didn’t already include Node.js 10, such as node or lts/*. In this case, the new version was appended to the list. We didn’t touch job or matrix configurations because these tend to be quite specific and complex, and it’s difficult to infer what the intentions were.

For many simpler .travis.yml configurations, this PR should suffice as-is, but depending on what you’re doing it may require additional work or may not be applicable at all. We’re also aware that you may have good reasons to not update to Node.js 10, which is why this was sent as an issue and not a pull request. Feel free to delete it without comment, I’m a humble robot and won’t feel rejected 🤖


FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Edge/IE fail to set Content-Type header on XHR whose body is a typed Blob

Hello Jimmy,

I am using your polyfill on my current project to be able to use the FormData object on IE 11, and it seems good until the request is actually processed by the server.

Working on a PHP back-end, when I var_dump the request Body I got something which looks like the following:

------formdata-polyfill-0.66513968191100183ContentDispositionform-dataname=emailben@toto.fr------formdata-polyfill-0.66513968191100183ContentDispositionform-dataname=password------

And so on. Obviously this body seems badly-formed.
I am using your polyfill by requiring it from my main JS entry file:

require("formdata-polyfill");

window.app = new (function()
{
     ...

And to submit my form I am using the following code:

if ( ! formData )
{
  var formData = new FormData( _.formInstance );
}

var xhr = new XMLHttpRequest();

xhr.open( method, url );

xhr.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );

xhr.send( formData );

The content of formData is ok at this point ( I displayed the key value content to be sure ). So I am not sure of the source of the issue. Any Idea ?

It's blocking for me right now, as I cannot get the complete support of my app on IE 11...

Let me know ;-)

Where to get v3

This may be a dumb question but where/how can I get the version 3?
Through npm it only gets to v2.0.4.

FormData polyfill on QTWebKit

I'm trying to get a zip file from a application which provides WebAPI.
And before display the contents of the zip file on QTWeb, unzip the file in the memory.
To realize the function above, I did by two steps as below:

  1. Download the zip file to the memory.
  2. Unzip the file and display it to the client browser.

At the first step,
On chrome, it turns out the results expected.
But on QtWebKit, errors occurred.
Codes as belows:

var blobData = new Blob([buffer], {type: 'application/x-zip-compressed'});
blobData.lastModifiedDate = new Date();
var formData = new FormData();
formData.append("fileOBJ",blobData,fileName);
var fileOBJ = formData.get("fileOBJ");

And errors as belows:
TypeError: undefined is not a constructor (evaluating 'formData.get(\"fileOBJ\")')
Is there any alternative method for formData.get() to solve this problem?

undefined or null reference

Hi, i using this polyfill, but i get error: Unable to get property 'apply' of undefined or null reference

screen shot 2017-11-27 at 17 09 16

jquery & ajax

before i used the plugin I've supplied directly the formData object created by new FormData() to $.ajax .

now i had to use _asNative() method:

            $.ajax({    
                url: ...,
                type: 'PUT',
                data: formData._asNative(),
                dataType: 'json',
                success: function(res) {
                    window.location.reload();
                },
                error: function() {
                    alert('..');  
                },
                processData: false,
                contentType: false,
                global: true
            });

I expect it to work the same.

Doesnt respect disabled attribute...

Hi, when submitting a form with disabled select/input fields using this polyfill results in values from those disabled fields also being included in the formdata key/value pairs (with no way of filtering them out).

So:
<input type="text" name="foo" value="isDisabled" disabled="disabled"/>
doesnt show up in a normal FormData call (tested under Chrome) but using your polyfill it appears in the data :-(

Assign FormData fields back to form? Any interest?

I was thinking of building something new to do the reverse thing (unrelated to this polyfill).

eg. You make a FormData instance and append a bunch of things.
Since it's now readable/iterable you could then loop over all the FormData items and assign all the fields back to a from element

<form>
  <input type="text" name="firstname">
  <input type="text" name="lastname">
</form>

<script>
  Object.defineProperty(HTMLFormElement.prototype, 'formData', {
    set(formData) {
      // loop over formData and append all values back to `this.elements`
    },
    get() {
      return new FormData(this)
    }
  })

  var form = document.querySelector('form')
  var fd = new FormData()
  fd.append('firstname',  'Bob')
  fd.append('lastname',  'Stone')

  form.formData = fd
  //  <input type="text" name="firstname"> would now have the value "Bob"
  //  <input type="text" name="lastname"> would now have the value "Stone"
</script>

Why?

It could be a easy way of assigning many values back to a form element where editing preference for an existing user account needs to change lots of things.
It would save you the hassle of having to loop over each element and assign it manually (no mather what the DOM structure looks like)

Note: It's also possible to get a FormData instance using the fetch api for example. I did this hack to download multiple images once in one request. Didn't have to zip everything. server can send a multipart/form-data back also

fetch('/settings')
  .then(res => res.formData())
  .then(fd => {...})

Polyfill changes the media type

In the console, the polyfill FormData shows as object Object and the native FormData is object FormData
image

I believe this causes an error when it hits the server that only accepts multipart-formdata
"{"status":null,"errorCode":400,"errorMessage":"The request could not be understood by the server due to malformed syntax.","response":"Content type 'application/json' not supported"}"

How to use is in a worker?

I have some issues trying to make it useful while running on a webworker. Basically there is no window on a webworker context and it crashes on first if.

How to use

Hi, I'm having trouble finding a way to get this to work. Do you need to 'require' it in as a certain variable at the top of your js file or does it automatically run?

Can you give an example of a use case with .append() a file and object with sending xhr? Do I need to assemble and send a Blob? If so, I'm not sure how to create this Blob.

Sorry, struggling to understand the documentation.

minification issue with uglify

when compiling with uglify I get :

ERROR in 1.chunk.js from UglifyJs
SyntaxError: Unexpected token: operator (>) [1.chunk.js:7515,15]

because of the line :

	const wm = o => map.get(o)

This is because the file is not transpiled, so i had to add this module so babel will transpile it during build, i think you should satisfy es5 script as the main script (compiled) and use js:next for the es6 code.

Also test minification of mode as stand alone.

ReferenceError: Blob is not defined

im getting this error whenever i try to compile.

below is how added on my webpack.mix.js

let mix = require('laravel-mix');
let Blob = require('blob');
require('formdata-polyfill')

mix.setPublicPath("public/");

const aliases = {
  resolve: {
    alias: {
      "@components": path.resolve(__dirname, "resources/js/components")
    }
  }
};

mix.js('resources/js/app.js', 'js')
    .webpackConfig(aliases);

An in-range update of karma is breaking the build 🚨

The devDependency karma was updated from 3.1.1 to 3.1.2.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

karma is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build failed (Details).

Release Notes for v3.1.2

Bug Fixes

Features

Commits

The new version differs by 11 commits.

  • 7d4d347 chore: release v3.1.2
  • 5077c18 chore: update contributors
  • fb05fb1 fix(server): use flatted for json.stringify (#3220)
  • 2682bff feat(docs): callout the key debug strategies. (#3219)
  • 4e87902 fix(changelog): remove release which does not exist (#3214)
  • 30ff73b fix(browser): report errors to console during singleRun=false (#3209)
  • 5334d1a fix(file-list): do not preprocess up-to-date files (#3196)
  • dc5f5de fix(deps): upgrade sinon-chai 2.x -> 3.x (#3207)
  • d38f344 fix(package): bump lodash version (#3203)
  • ffb41f9 refactor(browser): log state transitions in debug (#3202)
  • 240209f fix(dep): Bump useragent to fix HeadlessChrome version (#3201)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

safari on windows (version 5) seems to not take the help

hi,

thanks alot for the really helpful extension, it fixed my issues so far with ie...

in safari it doesnt seem to work though...

TypeError: 'undefined' is not a function (evaluating 'formData.set('jsondata', jqXHR.responseText)')

other things like forEach dont seem to work either...

have you had that experience, and if so, maybe you have a trick on howto load your plugin to work with all browsers...

'set' method is broken

FormData.js
@@ -159,7 +159,7 @@ class FormData {
    * @return  Void
    */
   set(name, value, filename) {
-    wm(this)[name + ''] = [value, filename]
+    wm(this)[name + ''] = [[value, filename]]
   }

select.selectedOptions not wildly supported

I am getting this error on the console when using v3.0.7 in IE11

SCRIPT5007: Array.prototype.slice: 'this' is Null or undefined
formdata.min.js (4,1)

Example code is:

<select name="example">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

If i remove the name-tag all is fine but then the select box doesnt show up in the final formdata :-(

Not handling handling radios correctly? 🤔

It appears the compiled code does not handle radios correctly.

I've built a small test page to demonstrate the issue:

https://test-formdata-polyfill.surge.sh/

Open your browser's console and you'll see the output of two FormData instances created from the same form. One is built from the browser's native implementation and the other from the polyfill:

image

It appears the polyfill wants to submit all the radio inputs – even the unchecked ones!

The code used to create the test page is here:

https://github.com/johnboxall/test-formdata-polyfill

Thanks so much for this module 🙏 – I was not expecting Mobile Safari to have such limited support for FormData. This repo saved us from a bunch of custom code!

e.append is not a function

Good day!

I'm getting a lot of errors in sentry:

e.append is not a function.

It's always occurs in:
Chrome Mobile iOS Version: 70.0.3538
iOS Version: 10.3.3

stacktrace points at this

if (elm.checked) self.append(elm.name, elm.value)

Unfortunately, i don't have device on 10.3.3 but maybe you have an idea about this error.

<select /> emits "undefined" in entries()

Instead of using the select element's "name" in the tuples, the constructor is using the option's "name". This appears to be inconsistent with the spec.

Lines in question:

FormData/FormData.js

Lines 131 to 133 in 59e46d0

else if (elm.type === 'select-multiple' || elm.type === 'select-one')
for (let opt of arrayFrom(elm.selectedOptions))
this.append(opt.name, opt.value)

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.