【问题标题】:ES6 features complient符合 ES6 功能
【发布时间】:2018-04-11 21:42:53
【问题描述】:

您好,我在更改需要导入语句时遇到问题。我的所有文件都支持箭头函数和 const、let 等。就在我将 require 语句更改为导入时,我遇到了很多麻烦。

以下是我的文件:

我的 Grunt 文件:

const request = require('request');
const webpackConfigDev = require('./webpack.config.dev');
const webpackConfigProd = require('./webpack.config.prod');

module.exports = function init(grunt) {
  require('time-grunt')(grunt);
  require('load-grunt-tasks')(grunt);

  const reloadPort = 35729;
  let files;

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    eslint: {
      target: ['app/**/*.js', 'clientSide/**/*.js', 'config/**/*.js',
        'test/**/*.js', 'app.js', 'Gruntfile.js'],
    },
    webpack: {
      options: {
        stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development',
      },
      prod: webpackConfigProd,
      dev: Object.assign({ watch: true }, webpackConfigDev),
    },

    mocha_istanbul: {
      coverage: {
        src: 'test/**/*.js',
        options: {
          check: {
            statements: 85,
            functions: 85,
            branches: 77,
          },
          excludes: [
            'app.js',
            'config/*',
            'migrations/xyz/*',
            'app/models/*',
          ],
        },
      },
    },
    mochaTest: {
      test: {
        options: {
          quiet: false,
          noFail: false,
        },
      },
      src: ['test/spec/**/*.js'],
    },
    develop: {
      server: {
        file: 'app.js',
      },
    },
    stylus: {
      dist: {
        files: {
          'public/css/style.css': 'public/css/style.styl',
        },
      },
    },


  grunt.config.requires('watch.js.files');
  files = grunt.config('watch.js.files');
  files = grunt.file.expand(files);

  // Load the npm dependencies into grunt
  grunt.loadNpmTasks('grunt-mocha-test');
  grunt.loadNpmTasks('grunt-mocha-istanbul');

  // Load webpack plugin npm tasks.
  grunt.loadNpmTasks('grunt-webpack');

  grunt.registerTask('delayed-livereload', 'Live reload after the node server has restarted.',
    () => {
      const done = this.async();
      setTimeout(() => {
        request.get(`http://localhost:${reloadPort}/changed?files=${files.join(',')}`,
          (err, res) => {
            const reloaded = !err && res.statusCode === 200;
            if (reloaded) {
              grunt.log.ok('Delayed live reload successful.');
            } else {
              grunt.log.error('Unable to make a delayed live reload.');
            }
            done(reloaded);
          });
      }, 500);
    });

  grunt.registerTask('test', [
    'env:test',
    'eslint',
    'mocha_istanbul',
  ]);

  grunt.registerTask('build', [
    'env:dev',
    'eslint',
    'stylus',
    'webpack',
    'mocha_istanbul',
    'develop',
  ]);

  // The default task just runs the project on dev
  grunt.registerTask('default', [
    'build',
    'watch',
  ]);
};

我刚刚从 const 更改为 import 到我的 .js 文件中,但这没有运行。当运行覆盖范围时,所有问题都开始了。 请帮帮我。我从 2 天开始就一直在尝试解决这个问题。

【问题讨论】:

  • 仅供参考,您可能想要import mysql from 'mysql';,而不是import * as mysql from 'mysql';,因为module.exports 在概念上是CommonJS 模块的“默认”。
  • 我之前尝试过,但它是同样的错误。意外的令牌导入
  • 是的!我将此作为评论留下,因为这只是一般的建议,而不是您问题的答案。其他人已经介绍过了。
  • 请发布完整的错误消息和堆栈跟踪。
  • yups 发布了它。

标签: javascript node.js ecmascript-6 ecmascript-5


【解决方案1】:

如果您喜欢冒险并且真的想在 Node.js 中使用模块,那么有一种方法。 Node.js 8.5 added experimental support for ES Modules。关于如何使用它的文档可以在ECMAScript Modules 中找到。以下是要点:

  • 使用 Node.js 8.5 或更高版本
  • 使用--experimental-modules 标志
  • 在您的模块文件中使用 .mjs 扩展名

【讨论】:

  • node.green 是查看哪个版本的 Node 支持哪个 ES6(又名 ES 2015)功能的极好快速参考。在 Node v6.x 以外的任何地方使用 ES6 真的是个坏主意。
【解决方案2】:

虽然import 是 ES6 的一部分,但 NodeJS 尚不支持它,并且最近才在浏览器中可用。所以你必须保留你的require 声明。请参阅this 了解更多信息

【讨论】:

  • 但必须有办法,也许通过某种工具来实现这一点。
【解决方案3】:

在你的 webpack 配置中使用 babel 加载器和预设来将 es5 转换为 es6。 Essentially

此外,还要为服务器创建一个 webpack 条目。目前,您仅将 webpack 用于客户端,因此服务器代码不会被转译。服务器配置将类似。请点击链接,并具体对其值进行以下更改

target: 'node',

  entry: {
    server: ['babel-polyfill', './src/server.js'],
  }

【讨论】:

  • 如果代码是在Node上运行的,通过Webpack使用是很迂回的。你不需要 Webpack 来使用 Babel。
  • OP 已经在他的示例代码中使用了 webpack。另外,如果 OP 坚持在 node 中使用 import,那么转译到 es5 是唯一的选择。
  • 我已经上传了我的 webpack 文件,它已经在使用 babel。同样的问题仍然存在。
  • 嗯,那肯定还有更多,因为无论如何 Webpack 已经理解 import 而无需 Babel。 Unexpected token import 是 Node 错误,而不是 Webpack 错误。
  • 你的意思是在继续为目标:web 我应该把上面的条目?
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 2015-12-15
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多