include

# John Barton (11 years ago)

In the module system we issue import {foo} from 'foo'; and the Loader computes an address, say foo.js, fetches the resource and compiles it. If the content of foo.js has no dependencies, it is evaluated, then the importer is evaluated. Yay!

Now suppose that foo.js defines a global value. Oh bad sure, but sometimes you have to play cards you are dealt. We still depend upon foo.js, bad or not bad.

In the current module system we have to abandon ship. In our importer we need to: // WARNING pre-load foo.js somehow!

Now imagine if we could issue include 'foo'; and the Loader computes an address, say foo.js,fetches the resource and compiles it. Since the content has no dependencies, it is evaluated, then the importer is evaluated. Yay!

On now back to preloading somehow, jjb

# Sam Tobin-Hochstadt (11 years ago)

Why not:

import {} from 'foo';

or

import * as f from 'foo';

This is assuming that there are no other desired exports -- if there are, then the case is even easier.

# Yehuda Katz (11 years ago)

There is also:

import "foo";
# John Barton (11 years ago)

Sorry, I was imagining a specific scenario without giving the specifics: include 'foo'; // foo is conventional JS, not a module

I have written on global in a module, it works ok, but the goal was specifically to mutate global with code written in a module.

Here I have given code, designed to be loaded with a <script> tag or

included with require() in node. When I try to use say import "foo"; I get things like

SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.

You could say, "oh this is just legacy code", but boy we've burnt a lot of energy on legacy modules maybe a small bit can be invested in legacy scripts.

jjb

# Yehuda Katz (11 years ago)

You could imagine a loader plugin that enabled:

import "legacy:foo";

Which would evaluate the module in a script context.