benjamn / reify

Enable ECMAScript 2015 modules in Node today. No caveats. Full stop.
MIT License
741 stars 29 forks source link

Declare variables with `let` for module code, but `var` in the Node REPL #17

Open benjamn opened 8 years ago

benjamn commented 8 years ago

Using let to declare imported variables in compiled code allows the variables to be scoped to the enclosing block, and enables warnings about redeclarations of identically-named variables:

if (process.env.NODE_ENV === "production") {
  import { S3 } from "aws-sdk";
  let s3 = new S3();
  s3.abortMultipartUpload(params, function (err, data) { ... });
}
// S3 and s3 should not be visible here!

Currently the import statement is compiled to

var S3;module.import("aws-sdk",{S3:function(v){S3=v}});

The use of var means the S3 variable will be visible anywhere in the enclosing function scope, which is dangerous if process.env.NODE_ENV !== "production".

Ideally (when possible) we would like to use let instead:

let S3;module.import("aws-sdk",{S3:function(v){S3=v}});

Note that const is not an option because imported symbols must be able to change their values whenever the source module gets around to exporting them.

However, using let in the Node REPL means you can't import the same symbol more than once, which can be really annoying. For that reason, when you require("reify/repl"), the compiler should generate var declarations instead (as it currently does).

jdalton commented 7 years ago

This is configurable now. Will this be resolved with the option.repl work or is it already resolved?