【问题标题】:Javascript 6to5 (now Babel) export module usageJavascript 6to5(现为 Babel)导出模块使用
【发布时间】:2023-03-05 20:04:01
【问题描述】:

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

然后用 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();

我的 gulp 文件:

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

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

【问题讨论】:

  • 您仍然需要一种从浏览器获取模块的方法,6to5 不会将文件组合在一起。
  • 如何用 gulp 制作这个? ://
  • 你可以使用像 browserify.orgesperantojs.org 这样的打包工具。

标签: javascript ecmascript-6 babeljs


【解决方案1】:

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

我发现最简单的工作流程是使用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 文件,并确保在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 可能会有所帮助。

【讨论】:

    【解决方案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'));
     });
    

    请注意,您需要在gulp.src 上使用src/*.js 转换所有文件

    【讨论】:

    • 呃,没有。 Require.js 与 CommonJS 无关 require
    • 好的,RequireJs 就是一个例子。我的意思是你需要一些库来为你在浏览器的window 对象上创建require 函数。
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多