使用Babel(和模块" transform-es2015-modules-systemjs")和SystemJS

时间:2016-05-04 06:43:22

标签: angular gulp ecmascript-6 babeljs systemjs

我在尝试使用babel模块时遇到以下错误" transform-es2015-modules-systemjs"。

执行 compileJs()下面指定的函数以将ES6转换为ES5时,在gulp构建中会发生此错误。

错误:

System.register(['gulp', 'gulp-util', 'run-sequence', 'require-dir', 'del'], function (_export, _context) {
  

ReferenceError:未定义系统

package.json 因gulp而失败:

"babel": {
"presets": [
  "es2015"
],
"plugins": [
  "angular2-annotations",
  "transform-decorators-legacy",
  "transform-class-properties",
  "transform-flow-strip-types",
  "transform-es2015-modules-systemjs"
]
},

这适用于gulp然而我希望将代码转换为SystemJs识别模块加载的格式(我试图避免使用webpack和browsify),默认情况下转换为浏览器无法识别的CommonJS又:

"babel": {
"presets": [
  "es2015"
],
"plugins": [
  "angular2-annotations",
  "transform-decorators-legacy",
  "transform-class-properties",
  "transform-flow-strip-types"
]
},

吞咽的功能:

function compileJs() {
  let enableJsSourceMaps = argv['enable-js-source-maps'] || process.env['GULP_ENABLE_JS_SOURCE_MAPS'] !== undefined;

  return gulp.src([
    'src/main/webapp/modules/**/*.js'
  ])
    .pipe(gulpIf(enableJsSourceMaps, sourcemaps.init()))
    .pipe(babel())
    .pipe(gulpIf(enableJsSourceMaps, sourcemaps.write('.')))
    .pipe(gulp.dest('target/gulp/main/modules'));
}
使用SystemJS的

index.html

<script>
        System.config({
            transpiler: "babel",
            babelOptions: {
                "optional": [
                    "runtime"
                ]
            },
            packages: {
                'modules': {
                    format: 'register',
                    defaultExtension: 'js'
                },
                'vendor': {
                    defaultExtension: 'js'
                }
            }
        });
        System.import('modules/config/bootstrap');
    </script>

任何人都可以解释为什么这不起作用,我可能会缺少什么?

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。

问题出在 package.json 中,以下内容适用于整个构建,包括用ES6编写的gulp文件:

"babel": {
"presets": [
  "es2015"
],
"plugins": [
  "angular2-annotations",
  "transform-decorators-legacy",
  "transform-class-properties",
  "transform-flow-strip-types"
]
},

所以解决方案是从 package.json 中删除以下内容:

"plugins": [
      "angular2-annotations",
      "transform-decorators-legacy",
      "transform-class-properties",
      "transform-flow-strip-types"
    ]

并将它添加到gulp中的compileJs()函数中,该函数只进行Angular2文件的转换:

function compileJs() {
  let enableJsSourceMaps = argv['enable-js-source-maps'] || process.env['GULP_ENABLE_JS_SOURCE_MAPS'] !== undefined;

  return gulp.src([
    'src/main/webapp/modules/**/*.js'
  ])
    .pipe(gulpIf(enableJsSourceMaps, sourcemaps.init()))
    .pipe(babel({ plugins: [
      "angular2-annotations",
      "transform-decorators-legacy",
      "transform-class-properties",
      "transform-flow-strip-types",
      "transform-es2015-modules-systemjs" ]} ))
    .pipe(gulpIf(enableJsSourceMaps, sourcemaps.write('.')))
    .pipe(gulp.dest('target/gulp/main/modules'));
}

然后生成可与 SystemJS 一起使用的转换文件。

希望这有帮助。

相关问题