当前位置:网站首页>Circular reference of ES6 module
Circular reference of ES6 module
2022-07-06 08:11:00 【Drunk and carefree Neo】
The cause is an error message during development :Cannot access '__WEBPACK_DEFAULT_EXPORT__' before initialization
.
Because the error information is not clear , There is no clear explanation of the reasons and solutions on the Internet , So it took me a long time to find the reason . How to check , Even the most stupid is also the most effective “ Code deletion method ”, That is, delete the code line by line from the entry file , Until you locate the specific error location , Then judge the cause of the problem with your own knowledge and experience .
The reason is that import The circular reference of results in webpack Unable to parse correctly .
One 、 Introduction to circular reference
The simplest a Refer to the b,b Also cited a, This produces a circular reference .
What is more complicated is that the link is longer , for example a -> b -> c -> d -> a.
Circular references may cause memory stack overflow . But there is not necessarily a problem , such as b Two methods are derived ,a The reference is b Method of export fn1, and b It's in the way fn2 Quoted in a, In fact, there will be no problem in this situation .
But due to possible risks , And it's hard to find , So try to avoid using circular references when writing code .
Two 、 Check in the project
utilize webpack Plug in for circular-dependency-plugin It is very convenient to check the circular reference problem in the project .
( Not all circular references have problems , Therefore, this plug-in is recommended to be used when troubleshooting problems , Whether to open it during development depends on personal needs .)
- Installing a plug-in :
npm i circular-dependency-plugin -D
- stay webpack Add in configuration file plugins To configure .
const CircularDependencyPlugin = require('circular-dependency-plugin')
export default {
...,
plugins: [
...,
new CircularDependencyPlugin(
{
exclude: /node_modules/,
include: /src/,
failOnError: false,
allowAsyncCycles: false,
cwd: process.cwd(),
}
),
]
}
- Restart project , You can see the warning message of circular reference in the startup command line , The plug-in will help you locate the file path of the problem .
3、 ... and 、esm Reference handling for
ESM(es modules, namely es6 modularization ) It is loaded at compile time , and commonJs The runtime load of is different .esm Be as static as possible , The dependencies of the modules can be determined at compile time , Because of this ,esm It can be carried out through static analysis tree shaking Optimize .
Code example :
- main.js
import a from './a'
console.log(a)
- a.js
console.log(' perform a')
import b from './b'
console.log(b)
console.log(' Import b after ')
export default ' I am a a modular '
- b.js
console.log(' perform b')
import a from './a'
console.log(a)
console.log(' Import a after ')
export default ' I am a b modular '
- perform main.js, Output results :
// main.js in import 了 a, Advanced to a analysis
// import Statement parsing in advance ,a in import 了 b, So pause a Parsing , Enter b analysis
// b in import 了 a, but a At this time, the execution is not finished , To get the a The value is undefined, Then continue to parse b
b.js:1 perform b
b.js:3 undefined
b.js:4 Import a after
// b Finished parsing and got it b Export results of , Start back to a Continue to analyze
a.js:1 perform a
a.js:3 I am a b modular
a.js:4 Import b after
// a After analysis , go back to main.js Parsing performed
main.js:2 I am a a modular
esm Of import The command is executed at the compilation stage , Take precedence over its own content .
esm Don't care if there is a circular reference , Just generate a reference to the loaded module , When the code is not executed , The value of this reference is undefined.
Four 、webpack Reference handling for
Even if esm There is no exception in the circular reference , stay webpack Errors may also be reported during compilation , After all webpack Will be able to esm Downgrade to es5, There may be some differences in the degradation processing .
The same example code above ,webpack(v5.64.4) Execute after processing console.log(a)
An exception or error will appear when the statement :Cannot access '__WEBPACK_DEFAULT_EXPORT__' before initialization
.
- esm The way to deal with it is , First static analysis import, Then the dynamic export export ( Export reference ).
- webapck The way to deal with it is , First of all, put all the export Mentioned the beginning of the module , then import promote .
5、 ... and 、 resolvent
1、 Reference extraction
It is to extract the place with circular reference into another separate file , In other words, do not use circular references .
2、 The export function
Change the default export object to the form of export function , Get and export the result from the return value of the function .
Because each function will form a separate local scope , Different scopes have different data reference addresses .
In this way, the result of each introduction is a new reference , No conflict , This situation webpack It can also be handled normally .
Reference link :
https://blog.csdn.net/wu_xianqiang/article/details/100705034
https://zhuanlan.zhihu.com/p/141863544?from_voters_page=true
https://zhuanlan.zhihu.com/p/33049803
边栏推荐
- How to prevent Association in cross-border e-commerce multi account operations?
- Common functions for PHP to process strings
- 08- [istio] istio gateway, virtual service and the relationship between them
- The State Economic Information Center "APEC industry +" Western Silicon Valley will invest 2trillion yuan in Chengdu Chongqing economic circle, which will surpass the observation of Shanghai | stable
- Type of data in energy dashboard
- Data governance: 3 characteristics, 4 transcendence and 3 28 principles of master data
- Migrate data from a tidb cluster to another tidb cluster
- 将 NFT 设置为 ENS 个人资料头像的分步指南
- Migrate data from SQL files to tidb
- 24. Query table data (basic)
猜你喜欢
24. Query table data (basic)
National economic information center "APEC industry +": economic data released at the night of the Spring Festival | observation of stable strategy industry fund
[redis] Introduction to NoSQL database and redis
Codeforces Global Round 19(A~D)
[research materials] 2021 China online high growth white paper - Download attached
ESP系列引脚说明图汇总
File upload of DVWA range
A Closer Look at How Fine-tuning Changes BERT
Asia Pacific Financial Media | designer universe | Guangdong responds to the opinions of the national development and Reform Commission. Primary school students incarnate as small community designers
[untitled]
随机推荐
升级 TiDB Operator
Pyqt5 development tips - obtain Manhattan distance between coordinates
[factorial inverse], [linear inverse], [combinatorial counting] Niu Mei's mathematical problems
Use dumping to back up tidb cluster data to S3 compatible storage
"Friendship and righteousness" of the center for national economy and information technology: China's friendship wine - the "unparalleled loyalty and righteousness" of the solidarity group released th
Flash return file download
Golang DNS 随便写写
Binary tree creation & traversal
flask返回文件下载
Asia Pacific Financial Media | "APEC industry +" Western Silicon Valley invests 2trillion yuan in Chengdu Chongqing economic circle to catch up with Shanghai | stable strategy industry fund observatio
Learn Arduino with examples
[untitled]
【云原生】手把手教你搭建ferry开源工单系统
shu mei pai
使用 BR 备份 TiDB 集群数据到兼容 S3 的存储
好用的TCP-UDP_debug工具下载和使用
P3047 [usaco12feb]nearby cows g (tree DP)
The State Economic Information Center "APEC industry +" Western Silicon Valley will invest 2trillion yuan in Chengdu Chongqing economic circle, which will surpass the observation of Shanghai | stable
What is the use of entering the critical point? How to realize STM32 single chip microcomputer?
Asia Pacific Financial Media | art cube of "designer universe": Guangzhou community designers achieve "great improvement" in urban quality | observation of stable strategy industry fund