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).
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:Currently the
import
statement is compiled toThe use of
var
means theS3
variable will be visible anywhere in the enclosing function scope, which is dangerous ifprocess.env.NODE_ENV !== "production"
.Ideally (when possible) we would like to use
let
instead:Note that
const
is not an option becauseimport
ed symbols must be able to change their values whenever the source module gets around toexport
ing them.However, using
let
in the Node REPL means you can'timport
the same symbol more than once, which can be really annoying. For that reason, when yourequire("reify/repl")
, the compiler should generatevar
declarations instead (as it currently does).