Javascript 6to5(现为Babel)导出模块用法

时间:2015-01-24 12:40:41

标签: javascript ecmascript-6 babeljs

我还是初学者,我尝试将一个类导出并导入到主文件中,另一个类导入其他类文件并使用它们。

然后用6to5(现在的Babel)吞下ES5代码。

// file a.js
import B from 'b.js';

class A {
  constructor() {
    B.methodB();
  }
}

export default A;

// file b.js
class B {
  methodB() {
    console.log('hi from b');
  }
}

export default B;

// file main.js
import A from 'a.js';
new A();

我的gulpfile:

var gulp = require('gulp');
var to5 = require('gulp-6to5');

gulp.task('default', function () {
  return gulp.src('main.js')
    .pipe(to5())
    .pipe(gulp.dest('dist'));
 });

这是我的dist/main.js文件:

"use strict";

var _interopRequire = function (obj) {
  return obj && (obj["default"] || obj);
};

var A = _interopRequire(require("a.js"));

new A();

控制台中的错误:ReferenceError: require is not defined

这当然不起作用......我做错了什么或者我还缺什么?我不完全明白。

2 个答案:

答案 0 :(得分:22)

我之前遇到了完全相同的问题......正如Qantas在评论中提到的,Babel(以前的6to5)将转换语法,但它不会进行模块加载或polyfill。

我发现最简单的工作流程是将browserifygulp一起使用。这需要在一次点击中进行转换,添加polyfill,捆绑,缩小和源地图生成。这个问题有一个非常好的例子:Gulp + browserify + 6to5 + source maps

此版本增加了缩小和填充。您案例的示例如下所示:

let gulp = require('gulp');
let browserify = require('browserify');
let babelify = require('babelify');
let util = require('gulp-util');
let buffer = require('vinyl-buffer');
let source = require('vinyl-source-stream');
let uglify = require('gulp-uglify');
let sourcemaps = require('gulp-sourcemaps');

gulp.task('build:demo', () => {
    browserify('./demo/app.js', { debug: true })
    .add(require.resolve('babel-polyfill/dist/polyfill.min.js'))
    .transform(babelify.configure({ presets: ['es2015', 'es2016', 'stage-0', 'stage-3'] }))
    .bundle()
    .on('error', util.log.bind(util, 'Browserify Error'))
    .pipe(source('demo.js'))
    .pipe(buffer())
    .pipe(sourcemaps.init({ loadMaps: true }))
    .pipe(uglify({ mangle: false }))
    .pipe(sourcemaps.write('./'))
    .pipe(gulp.dest('./demo'));
});

gulp.task('default', ['build:demo']);

重要的是uglify将mangle设置为false;它似乎与转换后的代码不太匹配。

如果您没有安装所有依赖项,则可能需要创建package.json文件,并确保在dependencies对象中定义了以下包:

"devDependencies": {
    "babel-polyfill": "^6.13.0",
    "babel-preset-es2015": "^6.13.0",
    "babel-preset-es2016": "^6.11.0",
    "babel-preset-stage-0": "^6.5.0",
    "babel-preset-stage-3": "^6.11.0",
    "babelify": "^7.3.0",
    "browserify": "^13.1.0",
    "gulp": "^3.9.0",
    "gulp-sourcemaps": "^1.6.0",
    "gulp-uglify": "^2.0.0",
    "gulp-util": "^3.0.0",
    "vinyl-buffer": "^1.0.0",
    "vinyl-source-stream": "^1.1.0"
}

如果与-g一起安装,其中大多数都无效,请考虑自己警告:P

然后,只需运行npm install来安装所有依赖项,然后gulp运行默认任务并转换所有代码。

你的其他文件看起来不错,你有正确的想法,在每个文件的开头导入并导出你的默认值:)如果你想在野外有一些babelified ES6的例子,我有一个couple of projects on GitHub可能帮助

答案 1 :(得分:-3)

似乎您需要在HTML中导入requirejs喜欢:

<script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.15/require.min.js"></script>

你的文件必须是这样的:

// file a.js
import B from './b';

class A {
  constructor() {
    B.methodB = function() {

    };
  }
}

export default A;


// file b.js
class B {
  methodB() {
    console.log('hi from b');
  }
}

export default B;

// main.js
import A from './a';

new A();

请注意,您需要将模块的目录./a./b放在import上。

你的gulpfile必须是:

var gulp = require('gulp');
var to5 = require('gulp-6to5');

gulp.task('default', function () {
  return gulp.src('src/*.js')
    .pipe(to5())
    .pipe(gulp.dest('dist'));
 });

请注意,您需要使用src/*.js

上的gulp.src转换所有文件