HTML文檔引入JS模塊出現(xiàn)路徑問題解決辦法
前言
JS抽離, 引入three模塊.
LiveServer報(bào)錯(cuò):
Uncaught TypeError: Failed to resolve module specifier "three".
Relative references must start with either "/", "./", or "../".
事實(shí)上我已經(jīng)數(shù)不清這是第多少次遇到這種問題了, 用HTML文檔寫一些庫的案例, 然后各種引入報(bào)錯(cuò), 找不到包之類.
只是這次的問題解決讓我印象頗深, 也收獲頗豐.
一、錯(cuò)誤情況
1.three引入
html:
<script src="./js/main.js" type="module"></script>
JavaScript:
import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
2.gsap引入
沒有在html文檔做操作, 直接npm下包在js文件引入:
import gsap from 'gsap';
結(jié)果就是兩個(gè)都沒能成功引入.
二、解決辦法
路徑?jīng)]有寫錯(cuò), 只能說打包之后路徑錯(cuò)誤找不到某個(gè)模塊了.
當(dāng)導(dǎo)入JavaScript
模塊時(shí), import
語句和import()
運(yùn)算符都有一個(gè)"模塊標(biāo)識(shí)符", 其指示要導(dǎo)入的模塊. 瀏覽器根據(jù)此標(biāo)識(shí)符解析出絕對(duì)路徑, 才能成功導(dǎo)入.
導(dǎo)入映射(import map)是一個(gè) JSON 對(duì)象, 其允許開發(fā)者在導(dǎo)入 JavaScript 模塊時(shí), 控制瀏覽器如何解析模塊標(biāo)識(shí)符. 它提供了在 import 語句或 import() 運(yùn)算符中用作模塊標(biāo)識(shí)符的文本, 其會(huì)在解析標(biāo)識(shí)符時(shí)與要替換的文本之間建立映射.
在HTML文件增加以下來協(xié)助瀏覽器正確解析模塊標(biāo)識(shí)符, 這段代碼可以在three.js源碼的example任意一個(gè)案例中找到.
第一個(gè)映射修正three模塊的路徑, 第二個(gè)修正OrbitControls等附加模塊的路徑.
<script type="importmap"> { "imports": { "three": "../../node_modules/three/build/three.module.js", "three/addons/": "../../node_modules/three/examples/jsm/" } } </script>
three的引入問題在于路徑錯(cuò)誤, LiveServer最后是需要找到three.module.js
, three的其他附加模塊需要找到j(luò)sm.
OrbitControls這種不在three.module.js內(nèi)的模塊導(dǎo)入, 可以在不配置importmap內(nèi)three/addons/的情況下:
import { OrbitControls } from '../../node_modules/three/examples/jsm/controls/OrbitControls.js';
實(shí)際上就是把importmap里的內(nèi)容直接寫到了js里.
但是對(duì)于three.module.js這種一次性導(dǎo)出多個(gè)類的文件就只能寫在importmap里了.
gsap引入失敗的問題在于HTML文檔里是不能直接這樣:
import gsap from 'gsap';
引入使用的.
需要先配置importmap:
<script type="importmap"> { "imports": { "gsap": "../../node_modules/gsap/index.js" } } </script>
然后再:
import { gsap } from 'gsap';
路徑不固定, 只要引導(dǎo)到index.js即可.
或者不配置importmap, 直接js文件里這樣寫:
import { gsap } from '../../node_modules/gsap/index.js';
總結(jié)
到此這篇關(guān)于HTML文檔引入JS模塊出現(xiàn)路徑問題解決辦法的文章就介紹到這了,更多相關(guān)HTML引入JS模塊路徑問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何確保JavaScript的執(zhí)行順序 之實(shí)戰(zhàn)篇
我曾在文章《如何在多個(gè)頁面使用同一個(gè)HTML片段 - 續(xù)》的最后提到JavaScript順序執(zhí)行的特性。雖然現(xiàn)代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關(guān)系,他們的執(zhí)行依然是按照引入順序進(jìn)行的。2011-03-03關(guān)于Bootstrap彈出框無法調(diào)用問題的解決辦法
這篇文章主要介紹了關(guān)于Bootstrap彈出框無法調(diào)用問題的解決辦法的相關(guān)資料,需要的朋友可以參考下2016-03-03JS產(chǎn)生隨機(jī)數(shù)的幾個(gè)用法詳解
下面小編就為大家?guī)硪黄狫S產(chǎn)生隨機(jī)數(shù)的幾個(gè)用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06Node.js開發(fā)指南中的簡(jiǎn)單實(shí)例(mysql版)
工作原因需要用到nodejs,于是找到了《node.js開發(fā)指南》這本書來看看,作者BYVoid 為清華大學(xué)計(jì)算機(jī)系的高材生,年紀(jì)竟比我還小一兩歲,中華地廣物博真是人才輩出,佩服2013-09-09JavaScript返回網(wǎng)頁中超鏈接數(shù)量的方法
這篇文章主要介紹了JavaScript返回網(wǎng)頁中超鏈接數(shù)量的方法,使用javascript中的document.links實(shí)現(xiàn)這一功能,需要的朋友可以參考下2015-04-04javascript使用正則獲取url上的某個(gè)參數(shù)
使用indexOf取得?之后的參數(shù),以&使split進(jìn)行分割成數(shù)組,下面展示了一個(gè)從url上獲取名為MenuCode參數(shù)的過程2014-09-09