GithubHelp home page GithubHelp logo

modules's Introduction

Modules Team

Purpose

The original Node.js Modules Team planned and developed the ECMAScript Modules (ESM) implementation in Node.js core.

The current team exists as subject matter experts to consult regarding the Node.js ESM implementation.

Members

Archives

  • Features: As part of creating the ECMAScript Modules implementation for Node.js 12.0.0, use cases were brainstormed, which led to a list of features. This feature list, which previously existed as a section in this repo's root README, informed what became the plan for the implementation.

  • Plan for New Modules Implementation: This document summarized the work that went into the new ECMAScript Modules implementation that shipped in Node.js 12.0.0.

modules's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

modules's Issues

Convert to Working Group through Chartering

Currently this group is set up as a "team", it would be way better if we were to be chartered. We can use this issue to track process. I will periodically update this original comment to have the most up to date summary of the current state of the process.

Define shipping criteria

What should be the criteria for shipping Modules in Node without a flag?

I'll keep this original comment up to date with the current state of the discussion in this issue

Cache system mismatch with web

Did a bunch of digging after #60 showed up. Didn't realize some cache mismatching mental models with how web works and how existing tooling and algorithms work until I reviewed.

As currently specced for web given:

/a1.mjs : 302 redirect -> /b/c/d.mjs
/a2.mjs : 302 redirect -> /b/c/d.mjs
/b/c/d.mjs -> imports './e.mjs'
/b/c/e.mjs
<script type="module">
import '/a1.mjs';
import '/a2.mjs';
</script>

For Node we can treat the redirects as symlinks.

Loads 3 module records, which means it does not match current ESM loader, nor --preserve-symlinks. Almost all tooling is written to CJS style realpathing but has a --preserve-symlinks compatible flag. These 3 (web, realpath [node default], symlinks [--preserve-symlinks]) modes have the following loads according to WHATWG upon review and consultation:

web realpath symlinks
module map key of /a1.mjs /a1.mjs /b/c/d.mjs /a1.mjs
module map key of /a2.mjs /a2.mjs /b/c/d.mjs /a2.mjs
module map key of ./e.mjs from /a1.mjs /b/c/e.mjs /b/c/e.mjs /a1/c/e.mjs
module map key of ./e.mjs from /a2.mjs /b/c/e.mjs /b/c/e.mjs /a2/c/e.mjs

Notably, the imports in current web spec are keyed before realpathing/redirecting for the module map (like --preserve-symlinks), but the resolves import specifiers as done post realpathing/redirecting (like default Node behavior).

This affects mismatch is in all build tools that I know of ??? Does anyone know of any build tooling that does this type of resolution, even if it requires configuration to do so?

We should look into this, it looks like web spec won't change it looks like after some talking. They seem to see it as a 2.5-3 year old issue and time to discuss likely won't change decisions :-/

Pluggable Loaders to support multiple use cases

As #81 is getting into implementation details of the loader I thought it might be a good idea to start discussing an idea I have been kicking around for a robust solution. "Pluggable Loaders". This is heavily inspired by nodejs/node#18392

TLDR; (bluesky)

  • Loader Plugins can be specified via an out of band mechanism (a.k.a. package.json or command line argument).
  • Loader Plugins can included within a project as an es module or installed via a package manager
  • Loader Plugins can specify the behavior of the loader including
    • behavior for specific extensions or mimetypes
    • behavior for lack of extensions (e.g. path searching)
  • Loader Plugins can cascade
    • plugins can override default behavior

Example loaders include

  • std/esm
  • TypeScript
  • wasm
  • Babel

Questions to be answered

  • Is this approach of interest?
  • Should plugins be specified per application or per package
  • What should node ship as default loaders?
    • Proposal
      • Package name map as default loader
      • "Legacy" loader shipped in core as well

Thoughts?

Named Exports for builtin modules

This is more of a technical discussion than an API discussion since it doesn't deal with universal code or ESM/cjs interop but rather with how named builtin modules are exported using named exports.

@devsnek has went ahead and worked on nodejs/node#18131 for adding named exports for builtins. It is currently blocked on nodejs/node#18131 (comment)

I think we should either:

  • expose another (internal) symbol for things Node wants to hide from inspect and put it specifically on proxies we use for live bindings
  • modify customInspect to run before showProxy
  • Don't wrap the live bindings in proxies, start with explicitly not supporting it in named exports and move to setters/getters slowly.

I'm willing to work on either one - pinging involved parties for discussion @addaleax @jdalton @devsnek @TimothyGu @BridgeAR @ljharb

I think the first solution is the easiest - opinions?

Module Interop (CommonJS resources from ESModules)

Kicking off this thread to discuss interop, specifically getting CommonJS (cjs) resources from inside of an ESModule(esm)

We currently have a transparent interop. .js is reserved for cjs and .mjs is reserved for esm. When you import, statically or dynamically, the file extension is used to determine the resource type.

There is a pull request to introduce modes which would change the behavior regarding file extensions depending on meta data in the package.json

There are two other proposals for how to get cjs resources that are non transparent, and would be necessary to if .js were to be aliased to esm

  • import.meta.require
  • import {require} from 'nodejs'

There has also been a suggestion of offering scoped variables in esm, similar to what we currently do with cjs.

What do people think?

Use Cases Meeting

Since people want to document use cases and also want to avoid speaking to implementation concerns. I would like setup a meeting specifically for that and follow up with that during the summit. During this meeting I want to brainstorm what scope use cases need to be in:

  • Identify valid list of actors that we are treating as stake holders for use cases
  • Can use cases mention standards compliance implementation expectations/requirements
  • Can use cases mention Modules/Module Systems that are not ESM Source Text Module Records
  • Can use cases mention platforms that are not Node.js
  • Can use cases mention tooling
  • Can use cases mention specific existing libraries of specific importance
  • Can use cases defer to other non-Node.js implementations/standards using ESM

From here we can try and gather use cases and progress with creating a separate document for them. I think some other people were interested in leading this effort, but can help organize this if we get stuck somehow.

I would like also to see if people are interested in use cases being held as a brainstorming discussion during the summit.

Feature: Named exports when importing CJS

Currently in NodeJS, if I import from a CJS module,

import ns from `./cjs-module.js`

It will allow this, but won’t allow named exports, i.e. the following is not allowed:

import {namedSomething} from `./cjs-module.js`.

This is called transparent interop.
The reason that NodeJS doesn’t allow named exports is that determining what those exports are MUST happen in the parsing phase of the ESM Spec (according to some, although there is contention about that too), and executing code is not allowed at or prior to that phase. But a CJS module’s exports can only be determined by evaluating the code in it (static analysis of JS is not an option as it is not determined to always give the correct results).

This would maybe have been cool if NodeJS was the first ESM implementation, but people are used to the babel way of doing modules, and in the babel world, named exports from CJS modules are allowed. This is because babel does not conform to the ESM spec to the letter (it can’t, because it just transpiles ESM to CJS).

And, good or bad, developers expect to use named exports when importing CJS.

I see these options:

  1. Continue the existing way (no named exports for CJS)
  2. Don’t conform to the spec when importing CJS
  3. Do late-linking/shaping of named modules based on late evaluation of CJS module
  4. Disallow transparent interop, and enable import.meta.require (or equivalent) to enable importing CJS from ES modules
  5. Enable metadata in the CJS module that can statically describe the exports for ESM, e.g. something like //export default; export foo, bar; at the head of the CJS file, thus enabling named exports when importing the file.

I am sure there are others options, so if you have another option besides those four, please add it here.

It would be great if for each options you specify pros and cons, or at least if you don’t like the option, specify a clear and simple use case that would be problematic if the option was chosen.

Edit by @GeoffreyBooth: Use case 12.

Travel Fund Available for Team Members to Attend Collaborator Summit in Berlin May 31 - June 1

Hey All,

Just wanted to raise awareness that members of this team may be eligible for a travel stipend to attend the Collaborator Summit in Berlin May 31 - June 1

Instructions to apply are available here --> https://github.com/nodejs/admin/blob/master/MEMBER_TRAVEL_FUND.md

Everyone in this team is eligible to sign up for a free foundation individual membership, more details found here

Please lmk if you have other questions

Could this be an opportunity to rebrand ?

TL;DR what if we take this new extension approach as an opportunity to rebrand JavaScript as ECMAScript so that cases like the following one would never ever possibly happen in the future?

.es VS .mjs

  • entry points / apps that are not module don't carry meaningless extensions with them
  • ECMAScript is the well known standard that defines JavaScript, more meaningful than .es to describe what's the content is highly improbable
  • people will start thinking, and talking, about ES instead of JS
  • the future would not hold copyrights

Everything else valid for .mjs would be valid for .es too.

Is this so insane, as a proposal ?

common counter argument

That's Spanish and Spain thing ...

The .fi extensions never had this issue.

There was the intent to buy an island to have .js domain ... here he have already a country that would give us that, without conflicting with its native language which is, indeed, not English (the language in which ECMAScript is defined)

Labelling Issues / PRs

I've gone ahead and made some initial labels for us to use

they are

cjs: CommonJS modules
discussion: Issue / PR is open for general discussion
duplicate: dupe
esm: EcmaScript Modules
governance: Related to governance and responsibilities of the team
interoperability: cjs <-> esm interop or node <-> browser interop
modules-agenda: to be discussed in future meeting
modules-review: to be reviewed by the team in github issue
roadmap: planning, goals, roadmaps, etc.
web-platform: pertaining to browsers

I'm imagining that without the discussion tag that issues should be scoped to the specific high level goal and not general discussion.

Are any of these confusing? Any that should be added?

Node.js Foundation Modules Team Meeting 2018-04-11

Time

UTC Wed 11-Apr-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 11-Apr-2018 12:00 (12:00 PM)
US / Mountain Wed 11-Apr-2018 13:00 (01:00 PM)
US / Central Wed 11-Apr-2018 14:00 (02:00 PM)
US / Eastern Wed 11-Apr-2018 15:00 (03:00 PM)
London Wed 11-Apr-2018 20:00 (08:00 PM)
Amsterdam Wed 11-Apr-2018 21:00 (09:00 PM)
Moscow Wed 11-Apr-2018 22:00 (10:00 PM)
Chennai Thu 12-Apr-2018 00:30 (12:30 AM)
Hangzhou Thu 12-Apr-2018 03:00 (03:00 AM)
Tokyo Thu 12-Apr-2018 04:00 (04:00 AM)
Sydney Thu 12-Apr-2018 05:00 (05:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

Approving PRs

  • doc: add meeting notes for 2018-03-28 #53
    • 1 minute timebox
  • doc: add meeting notes for 2018-03-14 #50
    • 1 minute timebox
  • Expand and Refine Membership rules #59
    • 5 minute timebox

Discussion

  • Can I be an observer? #56
    • 3 minute Timebox
  • Cache system mismatch with web #62
    • 10 minute timebox
  • Use Cases (Tracking Issue) #55
    • 35 minute timebox
  • Membership requirements #43
    • 10 minute timebox

Invited

  • Modules team: @nodejs/modules

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

How do we handle dynamic specifiers (without dynamic import)?

ESM cannot load a module "synchronously" with a dynamic specifier. Until we have top-level await, I think we need a supported way to do it. Two use cases:

let env;
if (process.env.NODE_ENV === 'production') {
  env = require('./prod.js');
} else {
  env = require('./dev.js');
}
let canvas, hasCanvas;
try {
  canvas = require('canvas');
  hasCanvas = true;
} catch (e) {
  hasCanvas = false;
}

I can think of three solutions:

  1. Explain in the documentation that one has to write the dynamic code in a commonJS module and import it.
  2. Add import.meta.require
  3. Add a builtin module that provides the require function (npm proposal)

Topics to discuss with TC39

Meeting is next week. I think we missed the boat to get something on the agenda but I can ask the chairs.

What are specific questions that we can ask the group or socialize during hallway track

Online Module Summit 2018-04-03

Time

Decided via doodle

UTC Tue 03-Apr-2018 14:00 (02:00 PM):

Timezone Date/Time
US / Pacific Tue 03-Apr-2018 07:00 (07:00 AM)
US / Mountain Tue 03-Apr-2018 08:00 (08:00 AM)
US / Central Tue 03-Apr-2018 09:00 (09:00 AM)
US / Eastern Tue 03-Apr-2018 10:00 (10:00 AM)
London Tue 03-Apr-2018 15:00 (03:00 PM)
Amsterdam Tue 03-Apr-2018 16:00 (04:00 PM)
Moscow Tue 03-Apr-2018 17:00 (05:00 PM)
Chennai Tue 03-Apr-2018 19:30 (07:30 PM)
Hangzhou Tue 03-Apr-2018 22:00 (10:00 PM)
Tokyo Tue 03-Apr-2018 23:00 (11:00 PM)
Sydney Wed 04-Apr-2018 00:00 (00:00 AM)

Or in your local time:

Proposed schedule

https://docs.google.com/document/d/1oAvF_qukb1dIUWji9GjHNCL5-0uJ3_M-yPG-lzJVBbs/edit#

Joining the Call

Members of the team can join the zoom:

https://zoom.us/j/486767135

Streaming

Part 1: http://www.youtube.com/watch?v=O-7rXALxL9Y
Part 2: https://www.youtube.com/watch?v=Eaofz2Cj9Lw


So there is a LOT of context to the module implementation. I think it would be useful for us to schedule a day of content to document the current state of things and to get individuals who have not been as involved up to speed. I'm imaging we likely could co-ordinate a day of content around this. Please use reactions to signify interest and comment topics you would like to see or volunteer to provide. We can also invite guests from outside the group (such as TC39, webpack, or participants from Frameworks)

I'll keep this original issue updated with content as it develops.

Topics

  • The history of ESModules
  • Differences between ESM + Common.js
  • Current State of Node.js implementation
  • What is an APM and why it matters

Adding last minute participants

I've had three individuals reach out independently about having missed the deadline as they did not see the call for participants.

Are there any objections to allowing a couple late comers before we have a chance to solidify membership policies?

Can I observe

I'm currently developing an open source JS as 4GL environment (for on going research and public use of various image analysis and conformance testing for multiple ISO printing quality standards).

Unfortunately, I spend most of my time trying to figure out how to make use of ES modules across NodeJS and Electron (even NW for a period) as modules are the most critical deciding factor for the design of the environment.

The goal is to not subscribe to legacy/bloated workflows (ie simulating ES modules) so that it can efficiently handle change to modules. This is currently accomplished using an experimental fast translation layer that can independently compile other languages (just TypeScript at the moment) without the additional and seemingly unavoidable overhead catering to build-time oriented workflows, which is normally embedded in the foundations of such libraries.

It would be extremely helpful if I am able to observe instead of the many hours wasted trying to figure out from sparse threads scattered across multiple projects the direction and rationale behind the committee's efforts. I am only interested in observing, willing to assist only if asked to do so.

Thanks

The future of .mjs

So I'm aware this is all still under the experimental flag and recognise its status as a result.

However, a fair amount of discussion is taking place across TypeScript and babel regarding where to direct attention with regard to modules.

microsoft/TypeScript#18442

A major point of uncertainty is whether or not the current ES Modules 'mode' and .mjs will continue on.

For what I can see, it seems like .mjs is here to stay. The goal of having a unified set of functionalites under a single file extension is obviously where you want to go, but .mjs/ES mode seems like the 'stepping' stone that will eventually make that a reality.

Is it possible to get a confirmation around how .mjs is to be treated, so basic file extension support can be approved with the caveat of it being experimental?

I'm one of I'm guessing many who have run with .mjs based projects, and would love to see a clear directive on this. It's been a long time coming I think.

Node.js Foundation Modules Team Meeting 2018-02-14

Time

UTC Wed 14-Feb-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 14-Feb-2018 11:00 (11:00 AM)
US / Mountain Wed 14-Feb-2018 12:00 (12:00 PM)
US / Central Wed 14-Feb-2018 13:00 (01:00 PM)
US / Eastern Wed 14-Feb-2018 14:00 (02:00 PM)
London Wed 14-Feb-2018 19:00 (07:00 PM)
Amsterdam Wed 14-Feb-2018 20:00 (08:00 PM)
Moscow Wed 14-Feb-2018 22:00 (10:00 PM)
Chennai Thu 15-Feb-2018 00:30 (12:30 AM)
Hangzhou Thu 15-Feb-2018 03:00 (03:00 AM)
Tokyo Thu 15-Feb-2018 04:00 (04:00 AM)
Sydney Thu 15-Feb-2018 06:00 (06:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

nodejs/modules

  • initial GOALS declaration #23
  • Scope of team #17
  • Managing Signal to Noise #15
  • Guiding Design Principles #11
  • Online Module Summit #9
  • Governance and Membership Requirements #8
  • How often and when should we meet? #2

Invited

  • Modules team: @nodejs/modules

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

With the number of people in the group we are going to have to find a new way to host the meeting, stay tuned.

Joining the meeting

--loader hooks for require()

Spawned from a comment on per package hooks .

I'm opening this issue to discuss if we should make the Loader mechanisms we have expand to be able to intercept require() specifiers as well. I think it is doable but requires we split the resolution between sync/async forms. Looking at this as well we might want to split up the resolution of format from path resolution, but that is a lot to discuss for the general first gathering of consensus on if this should be a hook we provide.

Node.js Foundation Modules Team Meeting 2018-05-09

Time

UTC Wed 09-May-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 09-May-2018 12:00 (12:00 PM)
US / Mountain Wed 09-May-2018 13:00 (01:00 PM)
US / Central Wed 09-May-2018 14:00 (02:00 PM)
US / Eastern Wed 09-May-2018 15:00 (03:00 PM)
London Wed 09-May-2018 20:00 (08:00 PM)
Amsterdam Wed 09-May-2018 21:00 (09:00 PM)
Moscow Wed 09-May-2018 22:00 (10:00 PM)
Chennai Thu 10-May-2018 00:30 (12:30 AM)
Hangzhou Thu 10-May-2018 03:00 (03:00 AM)
Tokyo Thu 10-May-2018 04:00 (04:00 AM)
Sydney Thu 10-May-2018 05:00 (05:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

Approving PRs (4 Minute Time Box)

  • doc: add 2018-04-25 notes #73
  • governance: introduce PR exemptions for minutes #72

Approving Observers (1 minute timebox)

*add tzmanics as observer (@tzmanics) #76

Discussion

  • Use Cases (Tracking Issue) #55
    • 55 minute timebox

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

maintain a summary document/website

i stumbled across https://github.com/martinheidegger/es6modules-nodejs which seems like a very appealing type of thing to keep updated, i think it would be nice to include something similar in this repo.

the repo also hosts a site, which i think is a pretty nice template as well (http://es2015-node.js.org/)

also https://github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node and ofc the ep https://github.com/nodejs/node-eps/blob/master/002-es-modules.md

/cc @martinheidegger

Use Case #42 Discussion

At today's meeting, some people expressed interested in a more complete description of the context and background around use case 42. Here's the usecase, for reference:

Rachel is a TypeScript user who is importing some JavaScript code that uses CommonJS. She uses declaration files that were written on DefinitelyTyped, but were authored as ES module top-level exports as so:

export function foo() {
}
export function bar() {
}

When she imports them from TypeScript, she gets code-completion on the namespace import for foo and bar

import * as thing from "some-package";
thing./* completions here*/

When she compiles her code to run on either the 'commonjs' or 'esnext' module targets, she expects both to run correctly.

So, first, some background. TypeScript has these things called "declaration files". They're additional metadata about a .js file that includes additional type information for a module (written in files with a .d.ts extension); this is how vscode can provide good completions for things like lodash and jquery. They usually look something like this:

// Type definitions for abs 1.3
// Project: https://github.com/IonicaBizau/node-abs
// Definitions by: Aya Morisawa <https://github.com/AyaMorisawa>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/**
 * Compute the absolute path of an input.
 * @param input The input path.
 */
declare function Abs(input: string): string;
export = Abs;

or this:

// ... some more definitions
export * from "./createBrowserHistory";
export * from "./createHashHistory";
export * from "./createMemoryHistory";
export { createLocation, locationsAreEqual } from "./LocationUtils";
export { parsePath, createPath } from "./PathUtils";
export { createBrowserHistory, createHashHistory, createMemoryHistory };

that is to say, normal es6 syntax with the addition of export= (to describe the commonjs only pattern of replacing the namespace object) and type annotations, without any expressions or blocks. Someone went and put in the effort to write these type definitions at some point in the past, and there's now a community of people authoring these and keeping them up-to-date. The hub of that community is DefinitelyTyped - every definition file published there is automatically published to the @types npm namespace under the same name as the package it corresponds with - this means that, for example, jquery has types available via @types/jquery. It's a kind of crowd-sourced documentation/metadata store.

So, the dilemma. The typescript compiler (and by extension the vscode js language service, as it is really just the typescript compiler behind a thin facade) follows node's module reolution scheme to find js and/or ts files. In addition, it will also look for an adjacent .d.ts file to provide type information for a .js file, and, failing that, an @types/packagename package with a declaration file to provide the types. (Failing either of those in some configurations it will fall back to the actual JS, if it is able to, but this is costly - there's a lot of JS and it needs to be processed a lot to get good type data from it, which is why declarations are preferred.) We have two unique issues to deal with in the esm transition, both of which come into play here in this use-case. The simpler one is emit - providing a node-esm emit target that interoperates decently. The more complicated one is typechecking.

To start with typechecking (for both js files and ts ones): You'll note in my description of declaration files above, I didn't mention anything about any encoding of the library's available module format(s). This is important - we expect that no matter if you're targeting cjs or amd or esnext that the same declaration file will be able to accurately represent the module. This is critical, as it turns out, because some of our consumers will target esnext with us, but then actually transpile to cjs using another bundling tool, like rollup or webpack (retaining the es6 style imports for dead code elimination). We (strongly) operate under the assumption that interop between various module formats is invisible to the end-user - this carries into the js editing experience, where we assume that weather you wrote import * as x from "lodash" or const x = require("lodash") it will produce roughly the same module[1], and have the same members when you look for completions on x. Now, clearly we're capable of changing this assumption (likely behind a flag, but w/e), but this would (will?) fracture our ecosystem of existing type definition files; anything already written would need to only be interpreted as a cjs package, and we'd have to introduce a marker (file extension, pragma, or otherwise) to flag a declaration file as node-esm so that we can reject the old one and only accept the other for resolution depending on the exact interop scheme. It's not exactly pretty, and goes about as far away from a single "universal" declaration file as you can get (and, naturally, starts to require extra maintenance work to maintain the doubled APIs). Compound that with the fact that nobody usually bothers to tell their editor anything about the files they're working with (ie, will this random .js file be targeting node-esm, esm, or cjs? - at least at first), and we might really have to start arbitrarily guessing about what types an import should actually map to on disk, depending on any exact interop scheme, which is no good from a type safety perspective.

Our emit issues are more clear, and mostly center around exactly how interop might work. The typescript compiler, being a transpiler with multiple supported output formats, allows you to write the same es6-style input code and transpile it to either cjs or esm module formats (or amd or umd or systemjs). It will also auto-generate a declaration file for you. Generally, it is expected that your code will function the same way when targeting any of these module runtimes and present the same interface to consumers who can understand the format (and the same declaration file is currently produced for all of them). Some constructs (like export namespace assignment) aren't supported on some emit targets (ie, esnext), but otherwise interop is generally expected (after all, that's a big part of a transpiler's job). Node's interop scheme, if not fully transparent, would probably require us to emit helpers/perform transforms mapping from the more transparent interop we support today to any more explicit form of module system interop supported by the platform, thus requiring a new, independent module target, different from normal un-transformed esnext modules. Failing that, it would require a flag that at least alters our checking and resolution to only allow any stricter platform interop scheme, which would, naturally, not be able to be the default so as to not break long time users.

We also have relatively strong compatibility needs, since our service needs to keep working on code that was written 1, 2, 3 years ago, as nobody wants to launch their editor on their legacy codebase and just be greeted with a bunch of confused warnings and incorrect types, which necessitates a lot of changes be non-default flags. Our stance is, typically, we only intentionally introduce "breaks" if said break is identifying real problems in your code (ie, you were accessing a property which could never actually exist, but we didn't catch before). And then we'll usually have a flag to turn off the new check. Even for the 3.0 release that we have a milestone up for now, we don't have any really major breaks in the backlog - just larger features (it's more of a pragmatic answer to "what comes after 2.9 when incremented by .1" than a semver major release).

[1]We have a flag for placing the module on an es6-style import's default and disallowing calling namespace objects (esModuleInterop), to align our typecheck and emit with babel's emit, however this isn't currently our default for fear of breaking longtime users.

cc @DanielRosenwasser I hope I've explained your concerns, but you should feel free to chime in.

[web-interop] Parsing Goal vs MIME

Even if the MIME has been considered non-blocking issue for the first iteration, I'm sure it'll come back in every possible occasion so I'd rather dedicate a single thread for this discussion in order to understand the direction, as opposite of underling this concern in other strictly unrelated threads.

Current Status

Node always used file extensions to distinguish parsing goals, and this worked well.

However, the assumption when a JavaScript file is encountered, as regular .js, is that such file would be an application/node like MIME type.

This is already conflicting with the meaning .js files had for the last 20+ years on the Web, where JS was born.

Current ESM Status

The proposed workaround to prevent parsing resolution conflicts with JavaScript files, is to use another extension that would conflict with the browser ecosystem built around .js.

Not only .mjs will need adoption by all existing software, operating systems, and static servers, the extension solution is in conflict with the web because the parse goal on the web is provided by the <script type> or by the usage of dynamic import(ESM).then(...) from non-module content.

The MIME on the web is equivalent for both ESM and non module JavaScript and the resolution has no conflict thanks to explicit opt-in defined by publishers.

Explicit Parsing Goal as ESM

I understand that .mjs is a workaround to solve parsing goal ambiguity, even if it still requires filesystem discovery and rules if there are two files with same name and both .js and .mjs extensions when imports omit such extension, but I would not understand an explicit ESM opt in flag that is incapable of loading as ESM regular .js files like every other player is already capable of:

  • <script type=module src=esm.js>
  • jsc -m esm.js
  • js52 -m esm.js

Explicit Parsing Goal Proposal via Flag

Whenever the command node -m esm.js is executed, the loaded JavaScript file will be handled as ESM and never as CJS. The -m is a name borrowed from others, it can be different if needed.

If the loaded file is CJS the program will throw an error because module and exports are unavailable in ESM and this is also undefined.

Whatever mechanism we'll decide to have to import CJS from an explicit ESM opt in executed program, will use application/node assumption for required and required files only.

Everything else that is imported via ESM syntax will be 100% ESM without any possible ambiguity: it's explicitly ESM.

Explicit Parsing Goal Proposal via npm

Whenever the package.json explicitly opts in as ESM, all its JavaScript files should be handled as ESM and never as CJS.

Benefits for the community

If we have 2 options to resolve forever ESM dispute in terms of what's ambiguous and what is not, I believe the effect could be summarized in these points:

  • explicit migration pattern. node will be 100% backward compatible without the flag
  • when there is no flag, the ambiguity could be resolved via MIME or, if really necessary, .mjs extension
  • the community will have a way to ignore the extension, go full in with the flag, or adopt the extension. We don't decide here for them, we listen instead.
  • bundlers can take better hints of how the targets should be handled.

I would like to understand if there's a chance to have consensus here or, in general, what is missing to make node ship ESM and its community decide the best way to move forward.

Thank You.

Membership requirements

In the most recent meeting we decided to waive an earlier decision to create membership requirements that would have moved about 20% of the members of the group to Observer status. We agreed to discuss what types of requirements we would like to have, and how the process would be handled in a transparent and fair way.

Some examples of requirements that we could measure:

  • Meeting Attendance
  • Participation in the nodejs/modules repo (issues / prs)
  • Participation in votes
  • Code review / participation in nodejs/node in regards to ESM

It is worth mentioning that coming to something actionable here is going to be difficult, and getting it right will be even harder. That being said, I think coming up with clear expectations up front will make this group overall healthier.

Node.js Foundation Modules Team Meeting 2018-04-25

Time

UTC Wed 25-Apr-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 25-Apr-2018 12:00 (12:00 PM)
US / Mountain Wed 25-Apr-2018 13:00 (01:00 PM)
US / Central Wed 25-Apr-2018 14:00 (02:00 PM)
US / Eastern Wed 25-Apr-2018 15:00 (03:00 PM)
London Wed 25-Apr-2018 20:00 (08:00 PM)
Amsterdam Wed 25-Apr-2018 21:00 (09:00 PM)
Moscow Wed 25-Apr-2018 22:00 (10:00 PM)
Chennai Thu 26-Apr-2018 00:30 (12:30 AM)
Hangzhou Thu 26-Apr-2018 03:00 (03:00 AM)
Tokyo Thu 26-Apr-2018 04:00 (04:00 AM)
Sydney Thu 26-Apr-2018 05:00 (05:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

Approving PRs (5 Minute Time Box)

  • doc: update membership list with ncu-team sync #66
  • doc: add meeting notes for 2018-04-11 #64
  • doc: add meeting notes for 2018-03-28 #53
  • doc: add meeting notes for 2018-03-14 #50
  • Expand and Refine Membership rules #59
    • Closes: Membership requirements #43

Approving Observers (3 minute timebox)

Discussion

Invited

  • Modules team: @nodejs/modules

Invited Observers

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

Node/Browser ESM Interoperability

How does this group see ESM interoperability between Node and the browser?

(In all the discussion in this issue, we should assume that the Node/JS code in question can work in both environments)

  1. Will we be able to take current browser ESM code and have it work in Node, transparently (i.e. without a build step that generates a distribution that is fit to run in Node)?

  2. Will we be able to take any Node code that uses only ESM, doesn't have bare imports, and always imports using relative paths and a file extension, and be able to run it transparently in the browser (i.e. used with a script src (type=module), but without a build step that generates a distribution that is fit to run in the browser)?

  3. Will we be able to take Node code like the one in question 2, except that it imports without using a file extension, and have it run in the browser using script src(type=module)? Given that currently the answer is no, and assuming we want to answer yes, what is the mechanism by which this will work? Is it a build step, a service worker, a smart http server that serves the file, do we work with the TC39/browser vendors to enable this, or is there another option?

  4. Will we be able to take Node code like the one in question 2, except that it uses bare imports (resolved using the regular Node ESM module resolution algorithm), and have it run in the browser using script src(type=module)? Given that currently the answer is no, and assuming we want to answer yes, what is the mechanism by which this will work? Is it a build step, a service worker, a smart http server that serves the file, do we work with the TC39/browser vendors to enable this, or is there another option?

  5. Will we be able to take an "npm app" (my terminology for an app that has a package.json with the required dependencies) that only uses ESM, be able to npm install it, and have it run in the browser by script src-ing the entry point? Given that currently the answer is no, and assuming we want to answer yes, what is the mechanism by which this will work? Is it a build step, a service worker, a smart http server that serves the file, do we work with the TC39/browser vendors to enable this, or is there another option?

(The first two questions are pretty trivial, as the answer today to both of them is yes, but I'm putting them here as a baseline and to see whether I missed something. The other questions are... more difficult.)

Governance and Membership Requirements

If this team plans to become a chartered working group we will need to determine a governance model as well as membership requirements. I'll use this original post to track the discussion. Currently listing the high level things that need to be determined

Governance Model

  • Decision Making Model

Membership Requirements

  • Participation Rules

Should we have a steering committee

The current governance model of the project would cause any issue that this group cannot reach consensus around to be sent to the TSC. As we have such a large group with varying opinions, I think it is highly likely that we will have to deal with resolving disagreements and situations where we can't reach consensus.

So I'd like to propose that we spin up a steering committee to help guide this group and act as a stop gap prior to TSC escalation.

There is somewhat of a prior art for this with the release team, where we have the top level release working group and a number of teams spun up underneath (LTS, Releasers).

Thoughts?

Modules in Node need to be as easy to use as current solutions

I’m encouraged by the 2018-04-11 meeting and its discussion of use cases and feature requirements, and the reevaluation of the Node modules effort’s overall goals. I hope that this leads to a final result that works better for everyone.

I wanted to add another goal, or metric of success, or something; I’m not sure where it belongs so I’ll just say it here:

Node should support ES modules without requiring extra tools for what users want to do.

Over the years, when Node has added support for new syntaxes, they’ve “just worked.” If I had been using the syntax before and transpiling via Babel, say, I would turn off that transform in Babel and my code would execute the same as before. I think average users would assume that the same should be true for import and export statements.

This article by @giltayar about Node’s --experimental-modules implementation has a great section near the end about how to create dual-mode packages, that can be imported by a project using either ES modules or CommonJS. The instructions describe using Babel via an NPM script to transpile .mjs files into .js files, to create entry points for each mode. Reading this, I feel like the development team missed the point. So in order to use Node’s “native” module support, I need . . . Babel?

I think that most users would treat interoperability with the existing Node ecosystem as a non-negotiable requirement of any project they work on. If forced to choose between using Node’s native ES module support or preserving interoperability, users are going to choose interoperability (either via CommonJS or tools like Babel or esm). If too many projects have too many “must-have” use cases that preclude them from using Node’s native ES module support, the native support will struggle to find usage. There’s not much point in building a feature that most people won’t use.

Node’s native ES module support needs to be better, both in performance and convenience, than Babel and esm. Those tools are the competition. Every implementation decision that differs from how those tools do things should have a very strong justification, especially if it makes working with modules harder or requires a sacrifice that those tools don’t ask the user to make. Eliminating barriers to adoption and ensuring seamless interoperation with the existing Node ecosystem should be overriding goals of the design of the implementation, above any other concerns.

Upstream changes to ESM in nodejs/node

During today's meeting there was discussion about what should we do with upstream changes to core. Some suggestions were

  • nothing, allow changes to happen as they have been
  • feature freeze. Allow bug fixes and infrastructure changes but do not land new features
  • stop all changes against the esm implementation
  • remove esm from core and start from scratch

It is worth noting that this team does not currently have any ability to demand that any of the above be implemented, but we do have enough representation from collaborators within this group that we can definitely make it work in practice if we have consesnsus

None of these solutions are ideal, but we do need to figure out a compromise.

One thing I think will be important if we do any sort of freeze on development, or removal of code, is that we set clear deadlines and expected deliverables for when that freeze is over, or when code is brought back.

Might need to lock down fragment usage

If WICG/webpackage#172 doesn't allow differing sources per fragment and the browser network stack also has the same constraint, we might want to impose the same constraint for fragments in our loaders. Where we would treat fragments as resolving to the URL without the fragment and having users rely on import.meta.url to differentiate.

Roadmap (preliminary draft)

Status: On hold, feel free to ignore this topic until further notice.

Below is a draft that attempts to structure some of the issues that have been addressed in @ceejbot's proposal as well as some of the other discussions that have taken place so far. This can be further broken up into separate issues once general consensus is reached on a starting point.

Roadmap (preliminary draft)

Milestone 0 - target [current] - CommonJS in Node

Goal: Ensure backward compatibility

  • leave all existing built-ins as is (don't modify existing globals in Node)

Details

It's unrealistic (at this time) to change existing built-ins without breaking the current node module ecosystem. It's not productive to even beginning to discuss deprecating CJS until ESM has been implemented and used extensively in the Node ecosystem.

This could be left unsaid but it's important to establish intent. This group doesn't exist to obsolete CJS without consideration of the greater Node community.


Milestone 1 - target [v10.0] - ESM Support in Node

Goal: ESM modules work in Node without plugins, loaders

  • Specification
  • mode:esm can be explicitly set by a CLI flag
  • mode:esm can be explicitly defined in package.json
  • mode:esm throws error if CJS is imported as ESM

Details:

This is only the first step. It does not include ESM<->CJS interop. It focuses on providing ESM support in Node. Any attempt to mix ESM with CJS or vice-versa will throw an error.

10.0 is a notable release number and provides an opportunity to mark a big transition point. For example, OS9 vs OSX. It can be used to mark a transition. For example, there is a huge body of documented questions on StackOverflow addressing existing CJS workflows. If the introduction of ESM happens with 10.0, it should be easy to tag all Node questions on StackOverflow with pre-10 vs post-10 context tags.

This will provide an opportunity for early-adopters to experiment with ESM in Node.js. It may also provide an opportunity for eager devs to produce alternative workarounds that address dealing with ESM<->CJS interop.


Milestone 2 - target [undefined] - ESM in CJS

Goal: Make ESM work in CJS

Out of scope. This is already addressed in userland by @std/esm and/or transpilation. No changes are required in Node.


Milestone 3 - target [undefined] - CJS in ESM

Goal: Make CJS work in ESM

  • Specification
  • add import.meta for ESM-compatible CJS built-ins

Details:

What needs to take place to make CJS mimic ESM in an ESM loaded module?

  • can import.meta.require be made async?
  • does making it async require top-level await?

CJS is the better 'known quantity' in the Node ecosystem. That's great! Now, what does it require to make require() work like ESM.


Extension A - target [undefined] - Conversion paths for CJS -> ESM

Goal: What does it take to convert CJS to ESM

Out of scope. This would be better addressed by userland.


Extension B - target [undefined] - Loader Hooks

Goal: Address how loader hooks can be implemented/used within the current scope


Extension C - target [undefined] - Loader Extensions

Goal: Addressing interop with existing loader extension workflows (ex APM)


Extension D - target [undefined] - npm asset interop

Out of scope


Updates:

Locking down fragment/query on bare package names

Right now hash/search fragments are preserved when importing new URLs:

import 'foo?a';
import 'foo?b';

will load 2 different modules and use these fragments as being passed to the "main" entrypoint of foo. This goes against how package name maps are seeking to work WICG/import-maps#38 . We should do a couple things to get in line with the package name map behavior if that is what we are seeking to use for web compatibility.

  1. treat all characters prior to / as part of the package specifier for these bare import specifiers. meaning that package names can contain ? or #.
  2. probably enhance errors for when the part of such specifiers preceding the ? or # get a message about if the prefix would have been found.

Guiding Design Principles

The TSC released a medium post outlining the state of ESM as well as some high level design principals

  • We are committed to shipping ESM
  • We are committed to ESM being first class in Node.js
  • We are committed to having the Node.js and Web platform as first class runtimes for modules.
  • Modules installed via npm should be able to run after installation without requiring a build step.
  • We are committed to supporting our current users and offering migration paths as necessary. This can be through interoperability or APIs to improve the developer experience of working between module systems.

As a new working group I think it will be important for us to make sure these principles align with our groups vision. If you are open to adopting the TSC's vision, please simply use a 👍🏽 reaction. If you would like to see changes please use this thread to offer opinions

Node.js Foundation Modules Team Meeting 2018-03-14

Time

UTC Wed 14-Mar-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 14-Mar-2018 12:00 (12:00 PM)
US / Mountain Wed 14-Mar-2018 13:00 (01:00 PM)
US / Central Wed 14-Mar-2018 14:00 (02:00 PM)
US / Eastern Wed 14-Mar-2018 15:00 (03:00 PM)
London Wed 14-Mar-2018 19:00 (07:00 PM)
Amsterdam Wed 14-Mar-2018 20:00 (08:00 PM)
Moscow Wed 14-Mar-2018 22:00 (10:00 PM)
Chennai Thu 15-Mar-2018 00:30 (12:30 AM)
Hangzhou Thu 15-Mar-2018 03:00 (03:00 AM)
Tokyo Thu 15-Mar-2018 04:00 (04:00 AM)
Sydney Thu 15-Mar-2018 06:00 (06:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

nodejs/modules

Approving PRs ~ 1 minute per item

  • doc: add meeting notes for 2018-02-28 #38

For awareness ~ 3 minutes per item

  • doc: add MANIFESTO.md #45
  • Use Cases Meeting #41
  • Online Module Summit #9

Discussion

  • Upstream changes to ESM in nodejs/node #42
    • 10 minute timebox
  • Use Cases for ESM in Node.js
    • 30 minute timebox

Invited

  • Modules team: @nodejs/modules

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

Scope of team

If we plan to charter, part of the process will be deciding on the scope of the team, and what we will be explicitly asking the TSC to take responsibility for.

While the original scope of this group was ESM, it is very likely that part of (or potentially all) the CJS implementation may be required to be in the scope of this group.

Let's use this thread to brainstorm

Presentation about named exports in core

I think it would be benefit for everyone (including @nodejs/tsc) if a member of @nodejs/modules prepare a 10-20 minutes presentation on the various options for named exports (nodejs/node#18131). I think it would help create some shared understanding behind the issue.

If we can publish that on youtube, this can also help to bring the community up to date.

Backporting regression fix from master to 9.x

Hey All,

we have an open PR to backport a change to modules from master to 9.x

nodejs/node#18923

Are there objections to landing this? As it had been landed on master prior to us deciding that we wanted to discuss a code freeze, I think it makes sense to backport.

reach out to WASM implementors

Per the State of WebAssembly videocast today. It seems they are trying to find out who are in charge of integrating with the Node.js module ecosystem, it was mentioned several times but I linked the easiest one to get some minor context.

We could setup a meeting maybe, and it sounded like @flagxor might be a good contact point to open the communication channel with.

@linclark , you might be the person best suited to get some high level information or background on this since you have been doing some WASM work as well.

Node.js Foundation Modules Team Meeting 2018-03-28

Time

UTC Wed 28-Mar-2018 19:00 (07:00 PM):

Timezone Date/Time
US / Pacific Wed 28-Mar-2018 12:00 (12:00 PM)
US / Mountain Wed 28-Mar-2018 13:00 (01:00 PM)
US / Central Wed 28-Mar-2018 14:00 (02:00 PM)
US / Eastern Wed 28-Mar-2018 15:00 (03:00 PM)
London Wed 28-Mar-2018 20:00 (08:00 PM)
Amsterdam Wed 28-Mar-2018 21:00 (09:00 PM)
Moscow Wed 28-Mar-2018 22:00 (10:00 PM)
Chennai Thu 29-Mar-2018 00:30 (12:30 AM)
Hangzhou Thu 29-Mar-2018 03:00 (03:00 AM)
Tokyo Thu 29-Mar-2018 04:00 (04:00 AM)
Sydney Thu 29-Mar-2018 06:00 (06:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

Approving PRs ~ 1 minute timebox

  • doc: add meeting notes for 2018-03-14 #50

For awareness ~ 3 minute timebox per item

PRs against Core

  • module: fix e.stack error when throwing undefined or null #19282
  • loader: allow importing wasm modules #18972
  • Allow for multiple --loader flags #18914

Announcements

  • Travel Fund Available for Team Members to Attend Collaborator Summit in Berlin May 31 - June 1 #48
  • Online Module Summit ~ April 3rd #9

Discussion

Invited

  • Modules team: @nodejs/modules

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

Node.js Foundation Modules Team Meeting 2018-02-28

Time

UTC Wed 28-Feb-2018 20:00 (08:00 PM):

Timezone Date/Time
US / Pacific Wed 28-Feb-2018 12:00 (12:00 PM)
US / Mountain Wed 28-Feb-2018 13:00 (01:00 PM)
US / Central Wed 28-Feb-2018 14:00 (02:00 PM)
US / Eastern Wed 28-Feb-2018 15:00 (03:00 PM)
London Wed 28-Feb-2018 20:00 (08:00 PM)
Amsterdam Wed 28-Feb-2018 21:00 (09:00 PM)
Moscow Wed 28-Feb-2018 23:00 (11:00 PM)
Chennai Thu 01-Mar-2018 01:30 (01:30 AM)
Hangzhou Thu 01-Mar-2018 04:00 (04:00 AM)
Tokyo Thu 01-Mar-2018 05:00 (05:00 AM)
Sydney Thu 01-Mar-2018 07:00 (07:00 AM)

Or in your local time:

Links

Agenda

Extracted from modules-agenda labelled issues and pull requests from the nodejs org prior to the meeting.

nodejs/node

  • loader: allow importing wasm modules #18972
  • esm: Implement esm mode flag #18392

nodejs/modules

  • Online Module Summit #9
  • doc: add meeting notes for Feb 14 2018 #27
  • doc: move code of conduct to CODE_OF_CONDUCT.md #29
  • Document quorum required in order to merge PRs #26
  • Governance and Membership Requirements #8
  • doc: use ncu-team sync to sync member list #31
  • maintain a summary document/website #35
  • Scope of team #17
  • Guiding Design Principles #11
  • initial GOALS declaration #23

Invited

  • Modules team: @nodejs/modules

Notes

The agenda comes from issues labelled with modules-agenda across all of the repositories in the nodejs org. Please label any additional issues that should be on the agenda before the meeting starts.

Joining the meeting

Need volunteer to chair next meeting

Hey All,

The next meeting overlaps with my talk at Google IO, and I won't be able to make it 😢

Does anyone want to volunteer to chair the meeting?

edit: I'll still make the issue, google doc for notes, and find someone affiliated with foundation to start the meeting + stream to youtube

Managing Signal to Noise

Discussions about the module implementation can be quite contentious and lead to very long threads that mix both implementation and philosophy. Personally I have found the amount of content churning out to be quite overwhelming in the past, and already see this beginning to happen in this repo.

How can we focus the conversation so as to not drive away potential collaborators and minimize the investment of time necessary to get started.

One suggestion to kick this off. Moving general discussion about concepts to a chat room and keep the issue tracker focused on implementation discussion? The line on this could be quite blurry, which is a concern

To be explicit, I in no way want to discourage people from having an open discourse, I just want to figure out the balance that can keep people engaged and avoid the pattern of "whoever talks the longest wins"

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.