google / traceur-compiler

Traceur is a JavaScript.next-to-JavaScript-of-today compiler
Apache License 2.0
8.17k stars 578 forks source link

Bug: "import <Module File Path>" doesn't execute the module body as expected. #2130

Open stuartZhang opened 7 years ago

stuartZhang commented 7 years ago

I'd like to report a bug for the ES6 module importing.

According to the ES6 spec., the ES6-Module statement "import " merely executes the JavaScript routine inside the module body but doesn't really import any external variables or functions into the current context.

However, accompanying the latest Google Traceur, the statement "import " doesn't execute the module body as expected. On the contrary, I feel that the importing statement is directly ignored.

Only the statement "import ... from ..." does run the ES6 module body. Nevertheless, in my use case, I only intend to execute a piece of JavaScript program by importing its module, without any of the importing variables.

I anticipate the incorrect ES6 compilation behavior can be renovated.

arv commented 7 years ago

We do have tests for this: https://github.com/google/traceur-compiler/blob/master/test/feature/Modules/ImportNoImportClause.js

What options are you using? Does import {} from '...' work?

stuartZhang commented 7 years ago

The traceur command is as such:

node_modules/.bin/traceur --module=www/js/main.bbjs --out=_build/www/js/main.js --arrow-functions=true --block-binding=true --classes=true --computed-property-names=true --default-parameters=true --destructuring=true --for-of=true --generators=true --numeric-literals=true --property-methods=true --property-name-shorthand=true --rest-parameters=true --spread=true --symbols=true --template-literals=true --unicode-escape-sequences=true --unicode-expressions=true --proper-tail-calls=true --annotations=true --array-comprehension=true --async-functions=true --async-generators=true --exponentiation=true --export-from-extended=true --for-on=true --generator-comprehension=true --member-variables=true --spread-properties=true --types=true --source-maps=file

Through the above command, I'd like to compile "www/js/main.bbjs" to "_build/www/js/main.js"

In the "www/js/main.bbjs" file, a dozen of ES6 modules are imported by the ES6 module directives:

import common from './common.bbjs'; import mojioSdk from './sdk/mojio-js-3.5.1-ext.bbjs'; import nestSdk from './sdk/nest-sdk-ext.bbjs'; import artikSdk from './sdk/artik-cloud-sdk-2.0.2-ext.bbjs'; import alert from './widgets/alert.bbjs';

If the importing statement includes the import variable, the body of the imported module will be executed, even though only an empty string is exported from the target module.

In the corresponding compilation output (i.e. the ES5 file), the below statement is present:

var common = $traceurRuntime.getModule($traceurRuntime.normalizeModuleName("./common.bbjs", "../../../www/js/main.bbjs")).default;

On the contrary, if the import variable is absent (e.g. as the below) in the importing statement, the body of the imported module won't be executed and the importing statement seems to be ignored in the main module "www/js/main.bbjs" by the Google Traceur.

import './common.bbjs'; import './sdk/mojio-js-3.5.1-ext.bbjs'; import './sdk/nest-sdk-ext.bbjs'; import './sdk/artik-cloud-sdk-2.0.2-ext.bbjs'; import './widgets/alert.bbjs';

jogboms commented 7 years ago

Has there been a fix or solution to this?

It's currently breaking up my development flow.

arv commented 7 years ago

I'm really not sure why this isn't working for you. The following works as expected:

http://google.github.io/traceur-compiler/demo/repl.html#import%20'.%2Fgenerators.js'%3B%0A

Also, what version are you using?