亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

為什么有些依賴必須 import *引入使用?

zhenglin
2025年11月5日 16:44 本文熱度 723

在日常前端開發(fā)中,我們常常通過 import 來引入第三方庫或模塊。像這樣:


import dayjs from "dayjs"

import { useState, useEffect } from 'react';

但你可能遇到過這樣一種情況:有些依賴如果直接寫成


import echarts from 'echarts';

會報錯,或者運行時報 echarts is undefined,而必須寫成:


import * as echarts from 'echarts';

這種現(xiàn)象可能會讓你感到疑惑:為什么 ECharts 必須使用 import * 的方式?難道普通的默認導(dǎo)入不行嗎?

本文將以 ECharts 為例,深入探討這一問題的根源,并順帶梳理 ES Module(ESM)與 CommonJS(CJS)模塊規(guī)范的差異,幫助你從底層理解 import * 背后的原因。


import 的幾種常見用法

在 ES Module 規(guī)范中,常見的幾種導(dǎo)入方式包括:

默認導(dǎo)入

代碼高亮:

import xxx from 'module';

要求模塊導(dǎo)出中必須有 export default xxx;。


具名導(dǎo)入

import { a, b } from 'module';

要求模塊內(nèi)部有 export const a、export const b 等具名導(dǎo)出。



命名空間導(dǎo)入


import * as mod from 'module';

將模塊的所有導(dǎo)出整合到一個對象 模塊 上。



通過ECharts 的導(dǎo)出方式深入import *

ECharts 的導(dǎo)出方式

熟悉完ES6的import的命名空間導(dǎo)入用法,我想echarts為什么需要通過import *答案已經(jīng)很明確了。我們來看看echarts的入口文件:


這三句話分別代表了三種不同的模塊兼容策略:

  • import * as echarts from ...

    表示 ECharts 的所有導(dǎo)出都是 具名導(dǎo)出,并沒有 export default。


  • export as namespace echarts;
    這是為了兼容 UMD 模塊,即在瀏覽器通過 <script> 直接引入時,可以掛載到全局變量 window.echarts 上。這樣我們在代碼里就能直接寫:

echarts.init(document.getElementById('main'));

  • export = echarts;

這是 CommonJS 風(fēng)格的導(dǎo)出,相當(dāng)于 module.exports = echarts,用于兼容 Node.js 或老的打包工具。

在這種情況下,TypeScript 需要你用 import * as echarts 來導(dǎo)入,而不是 import echarts from 'echarts'



為什么 ECharts 沒有用 export default

看到這里,你可能還是有些困惑,如果導(dǎo)出入口改成:

代碼高亮:

import * as echarts from './types/dist/echarts';

// Export for UMD module.

export as namespace echarts;

export default echarts;

我們代碼里不是就可以使用下面的導(dǎo)入方式了嗎?

import echarts from 'echarts';

原因主要有三點:


兼容性考慮


ECharts 是一個全球用戶量非常大的可視化庫,既要兼容 ESM,又要兼容 CommonJS,還要兼容 UMD(通過 <script> 引入時掛到 window.echarts 上)。
如果用 export default,對 CJS/UMD 的支持會比較麻煩,而 export = 在 TypeScript 下能天然兼容多種模塊系統(tǒng)。



歷史包袱


ECharts 最早是基于 UMD 格式發(fā)布的(早于 ES Module 普及)。
當(dāng)時的入口寫法更偏向:

if (typeof module === 'object' && module.exports) {

  module.exports = echarts;

} else {

  window.echarts = echarts;

}

后來遷移到 TypeScript 時,延續(xù)了 export = echarts 這種兼容寫法,而不是強行改為 export default。



  • API 設(shè)計思路


ECharts 官方的定位是“命名空間式 API”,也就是說,用戶習(xí)慣通過 echarts.xxx() 方式調(diào)用。
為了保持這種語義一致性,團隊沒有提供 default export,而是把所有 API 都掛在一個 echarts 命名空間對象下。


import * 的其他應(yīng)用場景

除了 ECharts,還有一些庫或工具函數(shù)常常需要使用 import *


  • 工具類庫

有些工具庫導(dǎo)出了非常多的函數(shù),如果不想逐個引入,可以整合為一個命名空間對象。例如:lodash-es

import * as _ from 'lodash-es';


const arr = [1, 2, 2, 3, 4];

console.log(_.uniq(arr)); // [1, 2, 3, 4]

  • 配置性常量集合

當(dāng)一個模塊只導(dǎo)出大量的常量或枚舉值時,import * 可以避免逐個列出,寫法更整潔。

例如:Node.js 內(nèi)置 path 模塊(ESM 版本)

代碼高亮:

import * as path from 'path';


console.log(path.sep);   // 當(dāng)前系統(tǒng)路徑分隔符(Windows: '', Linux/Mac: '/')

console.log(path.resolve('./src'));


如何判斷是否需要 import *

如果你不確定一個庫該怎么導(dǎo)入,可以采用以下幾種方式:

看文檔示例

查看源碼或 d.ts 文件

如果不想找文檔,可以直接打開項目的依賴

找到對應(yīng)的包,導(dǎo)出方式在index.d.ts 文件中可以看到

  

Trae/Cursor智能提示

并不是所有第三方庫都內(nèi)置Ts支持,有index.d.ts文件,這個時候你可以借助AI編譯器(如Trae或Cursor)的智能提示。

Trae的注釋生成代碼為例:

 

 

參考文章:原文鏈接?

?

該文章在 2025/11/5 16:44:27 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved