開發(fā)基于typescript的NPM包依賴其他包時(shí)遇到的問題

關(guān)于包的初始化和開發(fā)過程請(qǐng)參考其他文章。
談下在開發(fā)完成后,遇到了以下問題和解決方法。
首先上渴,需要一個(gè)測(cè)試環(huán)境來驗(yàn)證代碼正確性,我的包的項(xiàng)目結(jié)構(gòu)如下:

-- demo // 測(cè)試頁面
-- lib      // 最終上傳npm的包
-- node_mudules
-- src
...... // 其他文件

demo目錄下我建立了如下文件:

// ./demo
-- index.css
-- index.html
-- index.ts

./demo/index.ts將會(huì)是模擬使用者引入并使用包的入口

import 包 from '../src.index'
// 使用者寫業(yè)務(wù)代碼
......

下面開始測(cè)試喜颁,把index.ts引入index.html稠氮。

錯(cuò)誤一

Cannot use import statement outside a module

由于我的包還有依賴,使用了import引入半开,所以有這個(gè)報(bào)錯(cuò)隔披,那么我給加入一個(gè)標(biāo)簽類型

// ./demo/index.html
 <script type="module" src="./index.ts"></script>
錯(cuò)誤二

Access to script at 'file:///C:/Users/?/Documents/?/demo/index.ts' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.

我是本地文件直接訪問,但type='module'不支持寂拆,直接報(bào)了跨域奢米,那么我啟動(dòng)一個(gè)本地服務(wù)器代理(比如http-server)。

錯(cuò)誤三

開啟代理后纠永,發(fā)現(xiàn)我依賴的包開始報(bào)錯(cuò)鬓长。

原因是這個(gè)包是沒有被代理的,我只是引入了本地文件尝江,在本地文件里引入了包涉波。
這個(gè)時(shí)候我發(fā)現(xiàn)需要一個(gè)webpack來把我的代碼,和我依賴的包進(jìn)合并pack炭序,并且順便把ts轉(zhuǎn)換為js文件啤覆。

于是我使用了webpack5,并作為我的開發(fā)依賴使用惭聂。因?yàn)樾枰尤肱渲梦募蛅s編譯設(shè)置窗声,我的demo文件下變成了這樣:

// ./demo
-- index.css
-- index.html
-- index.ts
-- tsconfig.json // new
-- webpack.config.js // new
// webpack.config.js
const path = require("path");

module.exports = {
  entry: "./demo/index.ts", // 注意此處為相對(duì)項(xiàng)目根目錄
  devtool: "inline-source-map",
  mode: "development",
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
  watch: true,
  resolve: {
    extensions: [".tsx", ".ts", ".js"],
  },
  output: {
    filename: "[name].js",
    path: path.resolve(__dirname, "dist"),
  },
};

運(yùn)行webpack,生成了一個(gè)dist文件夾彼妻,里面含有打包出來的js文件嫌佑,包含了我的代碼和我的依賴包。

// ./demo
-- dist
 -- main.js
-- index.css
-- index.html
-- index.ts
-- tsconfig.json // new
-- webpack.config.js // new

此時(shí)html文件直接可以引入侨歉,不再需要代理屋摇。

// index.html
<script src="./dist/main.js"></script>
錯(cuò)誤四

還是出問題了,如果你的NPM包沒有依賴其他包幽邓,不會(huì)出現(xiàn)這個(gè)問題炮温,但是我有運(yùn)行依賴,所以出現(xiàn)了新錯(cuò)誤:Module not found: Error: Can't resolve 'xx' in 'xx'

解決方案

// webpack.config.js
......
 module: {
    rules: [
      // add
      {
        test: /\.m?js/,
        resolve: {
          fullySpecified: false,
        },
      },
    // add end 
      {
        test: /\.tsx?$/,
        use: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
......

直接在rule內(nèi)加上此規(guī)則牵舵,問題的根源是webpack v5對(duì)于import語法進(jìn)行了更嚴(yán)格的限制柒啤。

import name from 'pack_name' 
// 需要加入擴(kuò)展名 .js
 import name from 'pack_name.js'

沒有指定后綴會(huì)導(dǎo)致報(bào)錯(cuò),此問題并非webpack導(dǎo)致畸颅,在node14中同樣會(huì)異常,即ESM中的import需要指明模塊的拓展名。

相關(guān)issue被提到了typescript里面:Provide a way to add the '.js' file extension to the end of module specifiers

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欢揖,一起剝皮案震驚了整個(gè)濱河市反镇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌送火,老刑警劉巖拳话,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異种吸,居然都是意外死亡弃衍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門坚俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镜盯,“玉大人,你說我怎么就攤上這事猖败⌒魏模” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵辙浑,是天一觀的道長(zhǎng)激涤。 經(jīng)常有香客問我,道長(zhǎng)判呕,這世上最難降的妖魔是什么倦踢? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侠草,結(jié)果婚禮上辱挥,老公的妹妹穿的比我還像新娘。我一直安慰自己边涕,他們只是感情好晤碘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布褂微。 她就那樣靜靜地躺著,像睡著了一般园爷。 火紅的嫁衣襯著肌膚如雪宠蚂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天童社,我揣著相機(jī)與錄音求厕,去河邊找鬼。 笑死扰楼,一個(gè)胖子當(dāng)著我的面吹牛呀癣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦赖,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼项栏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蹬竖?” 一聲冷哼從身側(cè)響起忘嫉,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎案腺,沒想到半個(gè)月后庆冕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劈榨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年访递,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同辣。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拷姿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旱函,到底是詐尸還是另有隱情响巢,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布棒妨,位于F島的核電站踪古,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏券腔。R本人自食惡果不足惜伏穆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纷纫。 院中可真熱鬧枕扫,春花似錦、人聲如沸辱魁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至参滴,卻和暖如春强岸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卵洗。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弥咪,地道東北人过蹂。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像聚至,于是被迫代替她去往敵國(guó)和親酷勺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 127,712評(píng)論 1 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月扳躬,有人笑有人哭脆诉,有人歡樂有人憂愁,有人驚喜有人失落贷币,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,523評(píng)論 28 53
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,586評(píng)論 2 9
  • 信任包括信任自己和信任他人 很多時(shí)候击胜,很多事情,失敗役纹、遺憾偶摔、錯(cuò)過,源于不自信促脉,不信任他人 覺得自己做不成辰斋,別人做不...
    吳氵晃閱讀 6,181評(píng)論 4 8