如何通過webpack5搭建vue3+ts項(xiàng)目

現(xiàn)階段前端打包工具很多,目前常用的是webpack,grunt等扯躺,在沒出現(xiàn)更好的工具之前,學(xué)好這兩個(gè)其中的一個(gè)基本都?jí)蛴昧诵В壳白盍餍械倪€屬webpack录语,也是很多面試官喜歡問的話題,這篇文章從零了解打包機(jī)制难衰,只要你有耐心保證你會(huì)有收獲钦无。

安裝webpack和webpack-cli依賴

首先,還是需要初始化項(xiàng)目(npm init)盖袭,這里安裝的依賴建議是本地依賴而不是全局依賴失暂,如果安裝本地依賴又安裝全局依賴容易把人搞混,但是本地依賴不能使用webpack命令鳄虱,只能根據(jù)配置項(xiàng)來執(zhí)行弟塞。(npm install --save-dev webpack webpack-cli)

配置package.json打包項(xiàng)

{
  ......
  "scripts": {
    "build": "webpack --config webpack.prod.js"
  }
  ......
}

新建webpack.prod.js文件并進(jìn)行配置

在當(dāng)前目錄建立index.html,在src目錄下建立main.js拙已,這里的webpack配置運(yùn)行的環(huán)境是node决记,我們就可以使用common規(guī)范進(jìn)行編碼,entry(打包入口)output(打包出口倍踪,配置打包出口路徑和名字)系宫。這里使用了path.resolve進(jìn)行憑借,原因是window和linus解析路徑"/"不一樣建车,這里做兼容處理扩借。

const path = require("path");
module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
    }
};

配置html-webpack-plugin插件自動(dòng)生成index.html

const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: 'index.html'
        })
    ]
};

配置clean-webpack-plugin打包前先清除原有文件

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
    plugins: [
        new CleanWebpackPlugin()
    ]
};

在main.js配置vue3入口

這里使用的是vue3語法,還需要引用vue(npm install --save-dev vue)

import {createApp} from 'vue';
import App from './App.vue';
createApp(App).mount("#app");

在src目錄下建立App.vue根組件

<template>
    <div class="tree">
        <img src="../static/tree.png" />
        <div>樹木圖片-{{prive}}</div>
    </div>
</template>

<script>
import { ref } from 'vue';
import server from '../config/server.ts';

export default {
    setup(){
        let prive = ref(123);
        server({
            url:"/zhuyangmsg/add",
            method: "post",
            data: {a:1,b:2}
        })
        return {
            prive
        }
    }
}
</script>

<style>
    .tree{
        width:800px;
        margin: 0 auto;
    }
    .tree>img{
        width: 100%;
        height:500px;
    }
</style>

使用vue-loader編譯vue文件

下載依賴(npm install --save-dev vue-loader)

const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
    module: {
        rules: [
            { test: /\.vue$/, use: 'vue-loader' }
        ]  
    },
    plugins: [
        new VueLoaderPlugin()
    ]
};

使用babel-loader編譯js文件

下載依賴(npm install --save-dev babel-loader @babel/core @babel/preset-env)

module.exports = {
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: [{
                    loader: "babel-loader",
                    options: {
                        presets: ["@babel/env"]
                    }
                }]
            }
        ]  
    }
};

使用ts-loader編譯ts文件

在項(xiàng)目根路徑創(chuàng)建tsconfig.json文件缤至,下載依賴(npm install --save-dev ts-loader)

module.exports = {
    module: {
        rules: [
            { test: /\.ts$/, use: 'ts-loader' }
        ]  
    }
};

使用css-loader編譯css文件

這里use依賴是從后往前執(zhí)行潮罪,順序不能反,先嵌入css文件在把css文件加載到style標(biāo)簽中领斥,下載依賴(npm install --save-dev style-loader css-loader)

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]  
    }
};

使用url-loader編譯image文件

下載依賴(npm install --save-dev url-loader file-loader)

module.exports = {
    module: {
        rules: [
           {
                test: /\.(png|jpg|jpeg|gif|svg)/,
                use: {
                  loader: 'url-loader',
                  options: {
                    outputPath: 'static/',
                    limit: 10 * 1024
                  }
                }
            }
        ]  
    }
};

區(qū)分打包環(huán)境

項(xiàng)目根目錄創(chuàng)建webpack.common.js嫉到、webpack.prod.js、webpack.dev.js三個(gè)文件月洛,通過webpack-merge提取出公用配置(npm install --save-dev webpack-merge)何恶。注意:devtool配置會(huì)新建map文件,作用是打包后的文件和開發(fā)文件建立映射關(guān)系嚼黔,方便定位問題导而。
webpack.prod.js

const { merge } = require("webpack-merge");
const commonConfig = require("./webpack.common.js");
module.exports = merge(commonConfig,{
    mode: 'production'
});

webpack.dev.js

const path = require("path");
const { merge } = require("webpack-merge");
const commonConfig = require("./webpack.common.js");
const devConfig = {
    mode:'development',
    devtool:'cheap-module-source-map',
    //webpack-dev-server配置本地服務(wù)器忱叭,并配置跨域
    devServer:{
        static: path.join(__dirname, "dist"),
        port: 8000, // 本地服務(wù)器端口號(hào)
        hot: true, // 熱重載
        proxy: {
            '/api/*': {
              target: 'http://localhost:3333', // 目標(biāo)服務(wù)器地址
              secure: false, // 目標(biāo)服務(wù)器地址是否是安全協(xié)議
              changeOrigin: true, // 是否修改來源, 為true時(shí)會(huì)讓目標(biāo)服務(wù)器以為是webpack-dev-server發(fā)出的請(qǐng)求!
            }
        }
    }
}
module.exports = merge(commonConfig,devConfig);

使用cross-env區(qū)分打包環(huán)境

下載依賴(npm install --save-dev cross-env)

{
  "scripts": {
    "start": "webpack-dev-server --config webpack.dev.js",
    "dev": "cross-env NODE_ENV=development webpack --config webpack.dev.js",
    "build": "cross-env NODE_ENV=production webpack --config webpack.prod.js"
  }

封裝axios區(qū)分服務(wù)

項(xiàng)目根目錄建config目錄建立server.ts封裝公用的axios調(diào)用接口,通過process.env.NODE_ENV區(qū)分使用的服務(wù)今艺。

import axios from 'axios';
let baseUrl:string = ""
if(process.env.NODE_ENV == "development"){
    baseUrl = "http://development.com"
}else if(process.env.NODE_ENV == "production"){
    baseUrl = "http://production.com"
}
console.log(baseUrl)
const server = axios.create({
    baseURL: baseUrl,
    timeout: 10000
})
server.interceptors.request.use(config => {
    console.log("請(qǐng)求攔截");
    return config;
})
server.interceptors.response.use(response => {
    console.log("響應(yīng)攔截");
    return response.data;
})
export default server;
?著作權(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)容