Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1375|回复: 0

react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-3 09:19:02 | 显示全部楼层 |阅读模式

    因为项目需要搞一下按需加载,使用import实现代码打包分片按需加载,但是在实际使用中报语法错误。报错信息如下

    SyntaxError: ‘import’ and ‘export’ may only appear at the top level

    啊咧?报错了。

    查找发现很多人碰到过,解决方法不同,但是我这个报错适用下边这个方法。

    npm install --save-dev babel-plugin-syntax-dynamic-import

    然后调整babel-loader配置如下:

     

     

    use: { loader: 'babel-loader', options: { // 不采用.babelrc的配置 "babelrc": false, "presets": [ ["react"], ["es2015", { "modules": false }] ], "plugins": [ "syntax-dynamic-import", "transform-object-rest-spread", "transform-class-properties" ] } }







    //解决方法出处示下边这篇博文:
    http://www.shuizhongyueming.com/2017/11/28/webpack-dynamic-import%E5%87%BA%E9%94%99-syntaxerror-import-and-export-may-only-appear-at-the-top-level/



    为防止博客哪天不用了,整篇文章转载过来。以下示原博文。

    起因

    今天尝试使用webpck的import()来做代码分割。

    代码类似如下:

    import('./nice-scroll').then(init => init(dom))

    结果报错:

    ERROR in ./js/utils/auto-set-height.js
    Module build failed: SyntaxError: ‘import’ and ‘export’ may only appear at the top level (20:8)

    分析

    在package.json里面确认了一下,我用的webpack版本是^3.5.4,这个是一定支持import()方法的,那么问题应该就出在babel上了。

    先截取我的babel-loader的部分配置:

    use: { loader: 'babel-loader', options: { // 不采用.babelrc的配置 "babelrc": false, "presets": [ ["react"], ["es2015"] ], "plugins": [ "transform-object-rest-spread", "transform-class-properties" ] } }

    一开始我的猜想是plugin es2015里面的transform-es2015-modules-commonjs先于webpack处理了代码,所以报错。

    找了一下禁用的方法,改配置如下:

    use: { loader: 'babel-loader', options: { // 不采用.babelrc的配置 "babelrc": false, "presets": [ ["react"], ["es2015", {module: false}] ], "plugins": [ "transform-object-rest-spread", "transform-class-properties" ] } }

    还是不行。

    后面一直各种关键词的搜索,偶然在github上面找到这个问题Dynamic `import()` crashing in `ModuleConcatenationPlugin`的一个回答:

    Nope; babel will always process the code before webpack ever sees it; unless for some reason the file itself is being excluded from being processed by babel-loader.
    This error is unrelated to babel; it’s a webpack issue.

    这个回答,里面说到在webpack面对的代码都是babel处理过的,这个让我坚信问题还是在babel这块,继续搜索。

    意外找到这个这篇文章:代码分离 – 使用import()。里面说到了一个插件:syntax-dynamic-import

    Babel官方关于这个插件的描述是:

    Syntax only
    This plugin only allows Babel to parse this syntax. If you want to transform it then see dynamic-import-webpack or dynamic-import-node.

    显然这是一个语法解析的插件,使得babel能够理解dynamic import的语法。再联系上面的报错信息里面的SyntaxError,结果有点明显了。

    解决

    npm install --save-dev babel-plugin-syntax-dynamic-import

    然后调整babel-loader配置如下:

    use: { loader: 'babel-loader', options: { // 不采用.babelrc的配置 "babelrc": false, "presets": [ ["react"], ["es2015", { "modules": false }] ], "plugins": [ "syntax-dynamic-import", "transform-object-rest-spread", "transform-class-properties" ] } }

    重启webpack,顺利通过编译!!!

     
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 01:13 , Processed in 0.060582 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表