【问题标题】:Browserify - ParseError: 'import' and 'export' may appear only with 'sourceType: moduleBrowserify - ParseError: 'import' 和 'export' 可能只出现在 'sourceType: module
【发布时间】:2017-04-23 21:44:31
【问题描述】:

在我的 gulpfile 中有

var gulp = require('gulp');
var browserSync = require('browser-sync').create();
var sass = require('gulp-sass');
var babel = require("gulp-babel");
var rename = require('gulp-rename');
var source =  require('vinyl-source-stream');
var browserify = require('gulp-browserify');
var notify = require("gulp-notify");


gulp.task('js', function () {
    gulp.src('js/main.js')
       .pipe(babel())
        .pipe(browserify())
         .on('error', errorAlert)
        .pipe(rename('./dist/js/bundle.js'))
        //.pipe(uglify())
        .pipe(gulp.dest('./'))
         .pipe(notify({title: "Success", message: "Well Done!", sound: "Glass"}));


})

在我的 app.js 中,我尝试导入但出现错误

import SimpleBreakpoints from 'simple-breakpoints'

知道如何摆脱错误并使用导入语法吗?

编辑:.babelrc

{
    "presets": ["es2015"],

}

【问题讨论】:

  • 你能出示你的.babelrc文件吗?
  • 更新了帖子。
  • This open issue 可能是相关的。我使用了esmify,它可以工作。

标签: gulp ecmascript-6 browserify babeljs


【解决方案1】:

只需切换到 webpack 而不是 browserify 即可解决我的问题。

var webpack = require('webpack-stream')

gulp.task('default', function () {
  return gulp.src('src/source.js')
    .pipe(webpack({
      output: {
        filename: 'app.js'
      }
    }))
    .pipe(gulp.dest('dist/app.js'))
})

【讨论】:

    【解决方案2】:

    在 Gulp 中浏览

    对于那些使用gulp 并希望使用browserify 将ES6 转换为ES5 的人,您可能会偶然发现gulp-browserify 插件。 警告,因为它来自版本 0.5.1 gulp-browserify 不再支持!!!。此操作和使用gulp-browserify 进行编译的后果将导致源代码可能产生错误,例如有问题的错误或类似错误:Uncaught ReferenceError: require is not defined 或 Uncaught SyntaxError: Unexpected identifier 在您的 import 语句旁边,例如import * from './modules/bar.es6.js';

    解决方案

    Althoutg gulp-browserify 推荐“查看 gulp 团队的食谱,以供参考使用 browserify 和 gulp”。我发现这个建议无济于事。现在(2019 年 7 月 2 日)对我有用的解决方案是将 gulp-browserify 替换为 gulp-bro@1.0.3 插件。这成功地将 ES6 转化为 ES5(就像现在一样)——它可能会在未来发生变化,因为对 JavaSript 库的支持会随着它出现的时间而衰减。

    假设:要重现此解决方案,您应该安装 docker。除此之外,您应该熟悉babel 和babelify。

    源代码

    这个方案在docker环境下成功复现,运行node:11.7.0-alpine镜像。

    项目结构

    /src                          <- directory
    /src/app/foo.es6.js
    /src/app/modules/bar.es6.js
    /src/app/dist                 <- directory
    /src/app/dist/app.es5.js
    /src/gulpfile.js
    /src/.babelrc
    /src/package.json
    /src/node_modules             <- directory
    

    第 1 步:运行 docker 映像

    $ docker run --rm -it --name bro_demo node:11.7.0-alpine ash
    

    第二步:创建目录和源文件

    $ mkdir -p /src/dist
    $ mkdir -p /src/app/modules/
    $ touch /src/app/foo.es6.js
    $ touch /src/app/modules/bar.es6.js
    $ touch /src/gulpfile.js
    $ touch /src/.babelrc
    $ touch /src/package.json
    $ cd /src/
    
    $ apk add vim
    

    .babelrc

    {
      "presets": ["@babel/preset-env"]
    }
    

    package.json

    {
      "name": "src",
      "version": "1.0.0",
      "description": "",
      "main": "",
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "@babel/core": "^7.4.5",
        "@babel/preset-env": "^7.4.5",
        "babelify": "^10.0.0",
        "gulp": "^4.0.2",
        "gulp-bro": "^1.0.3",
        "gulp-rename": "^1.2.2"
      }
    }
    

    bar.es6.js

    "use strict"
    
    class Bar {
      constructor(grammar) {
        console.log('Bar time!');
      }
    }
    
    export default Bar;
    

    foo.es6.js

    "use strict"
    
    import Bar from './modules/bar.es6.js';
    
    class Foo {
      constructor(grammar) {
        console.log('Foo time!');
      }
    }
    
    var foo = new Foo()
    var bar = new Bar()
    

    gulpfile.js

    const bro = require('gulp-bro');
    const gulp = require('gulp');
    const rename = require('gulp-rename');
    const babelify = require('babelify');
    
    function transpileResources(callback) {
      gulp.src(['./app/foo.es6.js'])
        .pipe(bro({transform: [babelify.configure({ presets: ['@babel/preset-env'] })] }))
        .pipe(rename('app.es5.js'))
        .pipe(gulp.dest('./dist/'));
    
      callback();
    }
    
    exports.transpile = transpileResources;
    

    第 3 步 - 将 ES6 转换为 ES5

    $ npm install
    $ npm install -g gulp@4.0.2
    
    $ gulp transpile
    [09:30:30] Using gulpfile /src/gulpfile.js
    [09:30:30] Starting 'transpile'...
    [09:30:30] Finished 'transpile' after 9.33 ms
    
    $ node dist/app.es5.js
    Foo time!
    Bar time!
    

    转译后的源码app.es5.js

    (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
    "use strict";
    
    var _barEs = _interopRequireDefault(require("./modules/bar.es6.js"));
    
    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
    
    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
    
    var Foo = function Foo(grammar) {
      _classCallCheck(this, Foo);
    
      console.log('Foo time!');
    };
    
    var foo = new Foo();
    var bar = new _barEs["default"]();
    
    },{"./modules/bar.es6.js":2}],2:[function(require,module,exports){
    "use strict";
    
    Object.defineProperty(exports, "__esModule", {
      value: true
    });
    exports["default"] = void 0;
    
    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
    
    var Bar = function Bar(grammar) {
      _classCallCheck(this, Bar);
    
      console.log('Bar time!');
    };
    
    var _default = Bar;
    exports["default"] = _default;
    
    },{}]},{},[1]);
    

    【讨论】:

      【解决方案3】:

      在您的配置中,您将js/main.js 通过管道传输到 Babel,因此这是唯一将被转译的文件。当 Browserify 需要 app.js 时,它会看到 ES6 内容并影响您看到的错误。

      你可以使用 Babelify 来解决这个问题。这是一个 Browserify 转换,它将转换 Browserify 接收到的源。

      要安装它,请运行以下命令:

      npm install babelify --save-dev
      

      要对其进行配置,请将您的任务更改为:

      gulp.task('js', function () {
          gulp.src('js/main.js')
              .pipe(browserify({ transform: ['babelify'] }))
              .on('error', errorAlert)
              .pipe(rename('./dist/js/bundle.js'))
              //.pipe(uglify())
              .pipe(gulp.dest('./'))
              .pipe(notify({ title: "Success", message: "Well Done!", sound: "Glass" }));
      })
      

      【讨论】:

      • 非常感谢! “所以这是唯一将被转译的文件”是我丢失的信息。
      • @cartant 你介意添加完整的 gulpfile 吗?它与食谱完全不同,我似乎无法在您发布它时运行它(在 browserify 之后您无法管道..)
      • @GeorgeKatsanos 在回答问题时,我只关注了标题中的错误——这是 Browserify 收到 ES6 模块时的错误影响。答案只是为了解决 Babel/Babelify 问题;我没有太注意其他位。 (并且与构建相关的问题通常过于复杂而无法重现。)您绝对应该遵循您提到的食谱并在遇到问题时发布问题。希望你能成功。
      猜你喜欢
      • 2020-11-03
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多