Dynamic Imports for Code Splitting 原因:ESLint Parsing Error 'import'

新手上路,请多包涵

我正在使用此处的 VueJS Webpack 模板: https ://github.com/vuejs-templates/webpack

示例路线:

 const AuthRoute = () => import(/* webpackChunkName: "authroute" */ './AuthRoute.vue')

示例错误:

[eslint] 解析错误:意外的令牌导入

我遵循了 Webpack 的动态导入部分中提供的步骤,以及 Anthony Gore 关于如何在路由器级别使用 VueJS 完成代码拆分的博客文章。更具体地说,这是我的设置:

包.json

 ...
"babel-core": "^6.22.1",
"babel-eslint": "^8.0.3",
"babel-jest": "^21.2.0",
"babel-loader": "^7.1.1",
"babel-plugin-dynamic-import-webpack": "^1.0.2",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.24.1",
"eslint": "^4.13.1"
...

.babelrc

 {
  "presets": [
    ["env", {
      "modules": false
    }],
    "stage-2"
  ],
  "plugins": [
    "dynamic-import-webpack",
    "syntax-dynamic-import",
    "transform-runtime"
  ],
  "env": {
    "test": {
      "presets": ["env", "stage-2"]    }
  }
}

.eslintrc.js

 parserOptions: {
  parser: 'babel-eslint',
  sourceType: 'module',
  allowImportExportEverywhere: true
}

对于为什么我仍然看到这个错误,我有点不知所措。使用 npm run devnpm run build 时,我的代码按预期运行和工作,但此解析错误阻止文件的其余部分被检查,我无法抑制它。

任何/所有帮助表示赞赏!

原文由 Daniel Brown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 443
2 个回答

.eslintrc.js

 parserOptions: {
  parser: 'babel-eslint',
  sourceType: 'module',
  allowImportExportEverywhere: true
}

应该:

 parser: 'babel-eslint',
parserOptions: {
  sourceType: 'module',
  allowImportExportEverywhere: true
}

来源: https ://eslint.org/docs/user-guide/configuring#specifying-parser

使用 (@vue/cli) .eslintrc.json

 {
  "parser": "vue-eslint-parser",
  "parserOptions": {
    "parser": "babel-eslint",
    "ecmaVersion": 8,
    "sourceType": "module"
  }
}

原文由 Daniel Brown 发布,翻译遵循 CC BY-SA 3.0 许可协议

这个 StackOverflow 问答确实帮助我解决了这个问题,但目前在 2020 年 4 月,似乎需要 parser 密钥 parserOptions ,或者至少对于我的设置组合。

我将展示我在 Laravel 7/Laravel Mix 和 Vue 2.6~ 中使用的当前配置。

.eslintrc.json

 {
    "env": {
        "browser": true,
        "es6": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "airbnb-base",
        "plugin:vue/essential"
    ],
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "parser": "babel-eslint",
        "ecmaVersion": 2019,
        "sourceType": "module"
    },
    "plugins": [
        "vue"
    ],
    "rules": {
        // dat ruleset
    },
    "settings": {
        "import/resolver": {
            "alias": {
                "map": [
                    ["@", "./resources"]
                ],
                "extensions": [".vue"]
            }
        }
    }
}

如果您使用的是 Webpack 别名,则只需要 settings 键。

包.json

    "devDependencies": {
        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
        "babel-eslint": "^10.1.0",
        "eslint": "^6.8.0",
        "eslint-config-airbnb-base": "^14.1.0",
        "eslint-import-resolver-alias": "^1.1.2",
        "eslint-plugin-import": "^2.20.2",
        "eslint-plugin-vue": "^6.2.2",
        "laravel-mix": "^5.0.1",
    }

.babelrc

 {
    "plugins": ["@babel/plugin-syntax-dynamic-import"]
}

webpack.config.js

如果你在没有 Laravel Mix 的情况下“正常”使用 Webpack,你会发现这里的语法有点不同,但如果你使用 Webpack 别名,你会发现这很有用:

 // use named JS bundles
mix.config.webpackConfig.output = {
    chunkFilename: 'js/[name].bundle.js',
    publicPath: '/',
};

// alias the ~/resources folder
mix.webpackConfig({
    resolve: {
        extensions: ['.js', '.vue'],
        alias: {
            '@': `${__dirname}/resources`,
        },
    },
});

最后说明:我总是推荐使用 airbnb-base 配置并依靠它来形成你的 lint 规则的基础,因为它是为运行顽固的函数式编程技术的多开发人员环境创建的,用于不可变的单向数据流——因此,函数式响应式编程,同时避免了 JavaScript 的陷阱……并专注于声明式代码,同时避免相当糟糕的命令式代码。

我在关于在 Vue 中为 Airbnb 设置 ES Lint 的文章中写了更多的话: https ://medium.com/@agm1984/how-to-set-up-es-lint-for-airbnb-vue- js-和-vs-code-a5ef5ac671e8

原文由 agm1984 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题