vue.js - 动态导入导致错误:当前未启用对实验语法“dynamicImport”的支持

Posted

技术标签:

【中文标题】vue.js - 动态导入导致错误:当前未启用对实验语法“dynamicImport”的支持【英文标题】:vue.js - dynamic imports results in error: Support for the experimental syntax 'dynamicImport' isn't currently enabled 【发布时间】:2019-06-26 21:52:40 【问题描述】:

我今天第一次使用 Webpack 学习 Vue.js,并尝试让路由器处理惰性/动态导入。

我想使用惰性/动态导入,因为我正在重建我的内容管理系统,该系统有很多页面可能会或可能不会在用户会话期间使用,因此在需要时动态加载他们需要的模块,对我的申请更有意义。

我非常基本的路由器目前看起来像这样:

import Vue from "vue";
import Router from "vue-router";

Vue.use(Router);

function loadView(view) 
    return () => import(/* webpackChunkName: "view-[request]" */ `@/views/$view.vue`);


export default new Router(
    routes: [
        
            path: "/",
            name: "dashboard",
            component: loadView("Dashboard")
        ,
        
            path: "/login",
            name: "login",
            component: loadView("Login")
        
    ]
);

但是,我遇到了以下编译错误:

./src/router/index.js 中的错误模块构建失败(来自 ./node_modules/babel-loader/lib/index.js):语法错误: ...../src/router/index.js:支持实验性语法 'dynamicImport' 当前未启用

附注:

将@babel/plugin-syntax-dynamic-import 添加到 Babel 配置的“插件”部分以启用解析。

并告诉我哪一行是问题,这很明显:

return () => import(/*..........
             ^

我在几个月前单独使用 Webpack 时就意识到了这个错误,所以我知道我必须安装动态导入插件才能使其正常工作。

这是我安装的:

npm install babel-plugin-syntax-dynamic-import

我在我的babel.rc 配置文件中提供了这个插件并运行npm run dev 重新编译所有内容:


    "presets": [
        [
            "@babel/env", 
                "modules": false,
                "targets": 
                    "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
                
            
        ]
    ],
    "plugins": ["@babel/plugin-syntax-dynamic-import"]

但我仍然收到错误消息,我仍然无法使用动态导入功能!难道我做错了什么?其他人在让动态导入工作时遇到问题吗?


我的 webpack.config 文件:

'use strict';

const webpack = require('webpack');
const path = require('path');
const  VueLoaderPlugin  = require('vue-loader');
const htmlWebpackPlugin = require('html-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = 
    mode: 'development',
    entry: [
        './src/app.js'
    ],
    devServer: 
        hot: true,
        watchOptions: 
            poll: true
        
    ,
    module: 
        rules: [
            
                test: /\.vue$/,
                use: 'vue-loader'
            ,
            
                test: /\.js$/,
                use: 'babel-loader'
            ,
            
                test: /\.scss$/,
                use: [
                    'vue-style-loader',
                    'css-loader',
                    
                        loader: 'sass-loader',
                        options: 
                            sourceMap: true,
                            outputStyle: 'compressed',
                            data: `
                                @import "./src/assets/scss/_variables.scss";
                                @import "./src/assets/scss/_mixins.scss";
                            `
                        
                    
                ]
            
        ]
    ,
    resolve: 
        alias: 
            "@": path.resolve(__dirname, './src'),
            "Components": path.resolve(__dirname, './src/components/')
        
    ,
    optimization: 
        minimizer: [new UglifyJsPlugin()],
    ,
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new VueLoaderPlugin(),
        new HtmlWebpackPlugin(
            filename: 'index.html',
            template: 'index.html',
            inject: true
        )
    ]

我的 package.json 文件:


  "name": "manage_v2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server --config build/webpack.config.dev.js"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": 
    "axios": "^0.18.0",
    "vue": "^2.5.22",
    "vue-router": "^3.0.2",
    "vuex": "^3.1.0"
  ,
  "devDependencies": 
    "@babel/core": "^7.2.2",
    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
    "@babel/preset-env": "^7.3.1",
    "babel-loader": "^8.0.5",
    "babel-plugin-dynamic-import-webpack": "^1.1.0",
    "css-loader": "^2.1.0",
    "html-webpack-plugin": "^3.2.0",
    "node-sass": "^4.11.0",
    "sass-loader": "^7.1.0",
    "uglifyjs-webpack-plugin": "^2.1.1",
    "vue-loader": "^15.6.2",
    "vue-style-loader": "^4.1.2",
    "vue-template-compiler": "^2.5.22",
    "webpack": "^4.29.0",
    "webpack-cli": "^3.2.1",
    "webpack-dev-server": "^3.1.14"
  

【问题讨论】:

【参考方案1】:

经过数小时的挫折后,我自己解决了这个问题。我仍然不知道为什么 Babel、Webpack 和 Vue 文档中使用的方法不起作用,但我确实做到了:

我首先从 babel.rc 文件中删除了插件声明,然后在 webpack.config 文件中为 babel 加载器添加了一个选项:


    test: /\.js$/,
    use: 
        loader: "babel-loader",
        options: 
            plugins: [
                "@babel/plugin-syntax-dynamic-import"
            ]
        
    

我希望这对其他人有所帮助。

【讨论】:

刚刚和那个一起度过了我的一天!但我确实同意错误消息确实具有误导性。非常感谢【参考方案2】:

你有错误的插件分配:

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

应该是该插件的正确格式。

【讨论】:

很抱歉浪费您的时间,但我在发布问题时忘记将其改回。这是我第一次安装插件时使用的插件参考,但最终为了让它工作而更改了几次。

以上是关于vue.js - 动态导入导致错误:当前未启用对实验语法“dynamicImport”的支持的主要内容,如果未能解决你的问题,请参考以下文章

即时窗口中的动态导致“Microsoft.CSharp.RuntimeBinder.Binder”未定义或导入错误

Vue.js 动态图像路径未加载

SyntaxError:当前未启用对实验性语法“jsx”的支持

Vue.js 3:无法导入 Vue 全局对象

Vue.js 将子组件导入组件

如果已启用,如何修复“当前未启用对实验语法 'classProperties' 的支持”错误?