antd+typescript webpack打包后樣式丟失

問題描述

最近筆者最近正在將老的項目遷移至typeseript,項目跑起來之后發(fā)現(xiàn)antd相關(guān)的樣式全部丟失县袱,發(fā)現(xiàn)webpack打包后css相關(guān)的代碼沒有被提取出來,導(dǎo)致antd的樣式全部無效化瓮钥,原先的webpack配置文件:

module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader',
                        query: {
                            presets: [
                                '@babel/react', 
                                '@babel/preset-env'
                            ],
                            plugins: [
                                //  給antd做按需加載
                                ["import", {
                                    "libraryName": "antd",
                                    "libraryDirectory": "es",
                                    "style": "css" // `style: true` 會加載 less 文件
                                }],
                                //  這個拿來做注入代碼優(yōu)化的
                                ['@babel/plugin-transform-runtime',
                                {
                                    "corejs": false,
                                    "helpers": true,
                                    "regenerator": true,
                                    "useESModules": false
                                }],
                                //  支持類寫法
                                "@babel/plugin-proposal-class-properties"
                            ]
                        }
                    }
                ]
            },
            {
                test: /\.(css|scss)$/,
                exclude: /node_modules/,
                use: [
                    'isomorphic-style-loader',
                    //  MiniCssExtractPlugin.loader,  //自動提取出css
                    //  'css-loader?modules&localIdentName=[name]__[local]--[hash:base64:5]',
                    {
                        loader: 'typings-for-css-modules-loader',
                        options: {
                            modules: true,
                            namedExport: true
                        }
                    }
                ]
            },
            {
                //  專門處理antd的css樣式
                test: /\.(css|less)$/,
                include: /node_modules/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                ],
            },
            {
                test: /\.tsx?$/,
                exclude: /node_modules/,
                loader: 'babel-loader!awesome-typescript-loader',
            }
        ]
    },
    resolve: {
        alias: {
            // '@apiMap': path.resolve(__dirname, 'map/api.tsx'),
            // '@constants': path.resolve(__dirname, 'constants'),
            // '@utils': path.resolve(__dirname, 'utils'),
            // '@UI': path.resolve(__dirname, 'UIwidgets')
        },
        extensions: [
            '.ts', '.tsx', '.js', '.json'
        ]
    },
}

排查與解決

筆者思考了一下,同時參考網(wǎng)上的相關(guān)帖子烹吵,感覺可能是tsx文件中引入antd時按需加載的相關(guān)邏輯出現(xiàn)了問題碉熄,typescript下所有的js文件改寫為tsx文件,需要添加新的支持按需加載的插件肋拔,即ts-import-plugin,將webpack配置文件修改為如下:

    module: {
        rules: [
            //  處理js的babel loader相關(guān)配置被刪除
            {
                test: /\.(css|scss)$/,
                exclude: /node_modules/,
                use: [
                    'isomorphic-style-loader',
                    {
                        loader: 'typings-for-css-modules-loader',
                        options: {
                            modules: true,
                            namedExport: true
                        }
                    }
                ]
            },
            {
                //  專門處理antd的css樣式
                test: /\.css$/,
                include: /node_modules/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                ],
            },
            {
                test: /\.tsx?$/,
                loader: "awesome-typescript-loader",
                options: {
                  useCache: true,
                  useBabel: false, // !important!
                  getCustomTransformers: () => ({
                    before: [tsImportPluginFactory({
                      libraryName: 'antd',
                      libraryDirectory: 'lib',
                      style: true
                    })]
                  }),
                },
                exclude: [
                    /node_modules/
                ]
              }
        ]
    },

進(jìn)行打包之后報錯:

image

發(fā)現(xiàn)是跟解析less文件相關(guān)的bug,接下來我們引入less-loader,刪除對antd的css配置:

            // {
            //     //  專門處理antd的css樣式
            //     test: /\.(css|less)$/,
            //     include: /node_modules/,
            //     use: [
            //         MiniCssExtractPlugin.loader,
            //         'css-loader',
            //     ],
            // },
            {
                //  專門處理antd的css樣式
                test: /\.(less)$/,
                include: /node_modules/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'less-loader'
                ],
            },

繼續(xù)報錯:

image

根據(jù)提示锈津,表示less-loader不支持行內(nèi)javascript,要在選項中開啟:

            {
                //  專門處理antd的css樣式
                test: /\.(less)$/,
                include: /node_modules/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    {
                        loader: "less-loader",
                        options: {
                            lessOptions: {
                                javascriptEnabled: true
                            }
                        }
                    }
                ],
            },

網(wǎng)上有些帖子說開啟的配置寫法是這樣的:

    //  網(wǎng)上說的這樣改是針對老版本凉蜂,新版下會報錯
    loader: "less-loader",
    options: {
        javascriptEnabled: true
    }

實踐證明這樣的配置寫法在新版less-loader(6.0.0)中是會報錯的琼梆。
再次打包性誉,運(yùn)行成功。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茎杂,一起剝皮案震驚了整個濱河市错览,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煌往,老刑警劉巖倾哺,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刽脖,居然都是意外死亡羞海,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門曲管,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却邓,“玉大人,你說我怎么就攤上這事院水∩暧龋” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵衙耕,是天一觀的道長昧穿。 經(jīng)常有香客問我,道長橙喘,這世上最難降的妖魔是什么时鸵? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮厅瞎,結(jié)果婚禮上饰潜,老公的妹妹穿的比我還像新娘。我一直安慰自己和簸,他們只是感情好彭雾,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锁保,像睡著了一般薯酝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爽柒,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天吴菠,我揣著相機(jī)與錄音,去河邊找鬼浩村。 笑死做葵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的心墅。 我是一名探鬼主播酿矢,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼榨乎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘫筐?” 一聲冷哼從身側(cè)響起蜜暑,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎严肪,沒想到半個月后史煎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谦屑,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驳糯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氢橙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝枢。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悍手,靈堂內(nèi)的尸體忽然破棺而出帘睦,到底是詐尸還是另有隱情,我是刑警寧澤坦康,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布竣付,位于F島的核電站,受9級特大地震影響滞欠,放射性物質(zhì)發(fā)生泄漏古胆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一筛璧、第九天 我趴在偏房一處隱蔽的房頂上張望逸绎。 院中可真熱鬧,春花似錦夭谤、人聲如沸棺牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颊乘。三九已至,卻和暖如春醉锄,著一層夾襖步出監(jiān)牢的瞬間疲牵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工榆鼠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纲爸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓妆够,卻偏偏與公主長得像识啦,于是被迫代替她去往敵國和親负蚊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344