13

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

然后用 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

哪个当然行不通……我做错了什么或者我还缺少什么?我不完全明白。

4

2 回答 2

22

我自己之前也遇到过同样的问题...正如 Qantas 在评论中提到的那样,Babel(以前的 6to5)将转换语法,但它不会进行模块加载或 polyfills。

我发现最简单的工作流程是将browserifygulp一起使用。这需要一次性完成转译、添加 polyfill、捆绑、缩小和源映射生成。这个问题有一个很好的例子:Gulp + browserify + 6to5 + source maps

这个版本增加了缩小和 polyfills。您的案例示例如下所示:

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文件,并确保在依赖项对象中定义了以下包:

"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 的例子,我在 GitHub 上有几个项目可能会有所帮助。

于 2015-02-02T00:05:03.250 回答
-2

看来您需要像这样在 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/*.jsgulp.src

于 2015-02-10T11:33:06.660 回答