Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic Imports for Code Splitting cause: ESLint Parsing Error 'import'

I'm using the VueJS Webpack template found here: https://github.com/vuejs-templates/webpack

Example Route:

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

Example Error:

[eslint] Parsing error: Unexpected token import

I've followed the steps provided in Webpack's Dynamic import section, as well as Anthony Gore's blog post on how to accomplish code splitting with VueJS at the router level. More specifically, here is my setup:

Package.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 } 

I'm at a bit of a loss as to why I'm still seeing this error. My code runs and works as expected when using npm run dev and npm run build, but this parsing error prevents the rest of the file from being linted, and I am unable to suppress it.

Any/all help is appreciated!

like image 925
Daniel Brown Avatar asked Dec 14 '17 14:12

Daniel Brown


People also ask

Can ESLint run on code with import ()?

ESLint generally doesn't support syntax features until they reach stage 4 and become official. To run ESLint on code with import (), I would recommend using the babel-eslint parser instead.

Why does ESLint throw two warnings for static files in JavaScript?

In JavaScript applications, such as Node and React JS, you might see or use code that requires static files dynamically. As a result, ESlint throws two warnings unless you mute them. The warnings are: Calls to require () should use string literals eslint (import/no-dynamic-require).

How do you use ESLint in require statement?

Calls to require () should use string literals eslint (import/no-dynamic-require). That is, a static, unchanged string instead of a dynamic one should be used. Unexpected require () eslint (global-require). Means, the require statement should be at the top of the file.

What is dynamic import in JavaScript?

This article is a detailed guide on how to use dynamic import, which enables code splitting and lazy loading. It also describes how to use error boundaries to catch errors. Is import () a Function? import () is currently in stage 4 of the TC39 process. It is a function-like module loading syntactic form in JavaScript.


2 Answers

.eslintrc.js

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

Should Be:

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

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

With (@vue/cli) .eslintrc.json

{    "parser": "vue-eslint-parser",    "parserOptions": {      "parser": "babel-eslint",      "ecmaVersion": 8,      "sourceType": "module"    }  }
like image 150
Daniel Brown Avatar answered Sep 28 '22 05:09

Daniel Brown


This StackOverflow question and answer did help me solve this issue, but currently in April 2020, the parser key seems to be required inside parserOptions, or at least for my combination of settings.

I will show my current day config that I use with Laravel 7/Laravel Mix and 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"]             }         }     } } 

You'll only need that settings key if you are using Webpack aliases.

package.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

If you are using Webpack "normally" without Laravel Mix, you will find your syntax is a little different here, but if you are using Webpack aliases, you will find this useful:

// 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`,         },     }, }); 

Final note: I always recommend usage of airbnb-base config and to rely on it to form the basis of your lint rules because it was created for multi-developer environments running die hard Functional Programming techniques for immutable, unidirectional data flow--and thus, Functional Reactive Programming while avoiding the pitfalls of JavaScript... and to focus on declarative code while avoiding reasonably bad kinds of imperative code.

I wrote a couple more words about that in my article about setting up ES Lint in Vue for Airbnb: https://medium.com/@agm1984/how-to-set-up-es-lint-for-airbnb-vue-js-and-vs-code-a5ef5ac671e8

like image 28
agm1984 Avatar answered Sep 28 '22 05:09

agm1984