17、webpack從0到1-構(gòu)建vue項(xiàng)目

講下webpack中的對于vue配置,其實(shí)vue官方就提供了一套模板vue-webpack-template,我們學(xué)習(xí)學(xué)習(xí),然后基于當(dāng)前自己的項(xiàng)目來配置下。
git倉庫:webpack-demo

1、處理vue

  • 對于.vue這種文件,webpack肯定是不認(rèn)識(shí)的,所以我們需要相應(yīng)的loader來處理它,通過查閱文檔我們發(fā)現(xiàn)需要安裝這兩個(gè)東西:
$ npm install vue-loader vue-template-compiler --save-dev
  • 然后安裝文檔上面的教程,照貓畫虎搞一下。這個(gè)loader兩個(gè)環(huán)境都是需要的,我們應(yīng)該是丟到webpack.common.js中:
// webpack.common.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  module: {
    rules: [
      // ... 其它規(guī)則
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },
  plugins: [
    // 請確保引入這個(gè)插件!
    new VueLoaderPlugin()
  ]
}

2、寫點(diǎn)vue

  • 首先既然要使用vue,就需要安裝它。
$ cd chapter17
$ npm install vue --save
  • 然后我們需要對當(dāng)前的文件目錄做次比較大的改動(dòng):
  webpack-demo/chapter17
  |- /build
  |- src
-   |- assets
-   |- styles
-   |- content.js
-   |- footer.js
-   |- header.js
-   |- logo.js
+   |- App.vue
    |- index.js
  |- index.html
  |- package.json
  |- postcss.config.js
  |- README.md
  • 然后我們在App.vue中寫點(diǎn)內(nèi)容(你應(yīng)該很熟悉):
<template>
  <div id="app">
    hello world
  </div>
</template>

<style lang="scss">
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
</style>
  • 然后我們刪掉src/index.js這個(gè)入口文件原來所有的示例代碼,使用下面這部分替換:
import Vue from "vue";
import App from "./App.vue";

Vue.config.productionTip = false;

new Vue({
  render: h => h(App)
}).$mount("#app");
  • 上面這個(gè)就是vue的語法羅,會(huì)將所有的內(nèi)容都掛載到idapp的這個(gè)元素上,很明顯我們目前沒有,所以我們需要對src/index.html這個(gè)模板加上這個(gè)元素:
<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>

<body>
+    <div id="app"></div>
</body>

</html>
  • 然后我們npm run dev打包,瀏覽器中就會(huì)顯示出hello world了?,F(xiàn)在,是不是有點(diǎn)vue的那意思了?

3、關(guān)于路由

  • 頁面要跳轉(zhuǎn),很明顯,現(xiàn)在我們還少了vue-router這個(gè)必要的東西,然我們參照官網(wǎng)的教程,安裝一下:
$ npm install vue-router --save
  • 然后,為了讓我們現(xiàn)在這個(gè)項(xiàng)目跟像一個(gè)標(biāo)準(zhǔn)的vue項(xiàng)目,所以我們參照一下vue-webpack-template的目錄結(jié)構(gòu)對我們的做點(diǎn)修改。
    • 我們將原來的一直伴隨我們的header、footer、content三塊的js及樣式文件都遷移到了components目錄下作為了三個(gè)子組件
    • 新建了一個(gè)src/views里面放了放了兩個(gè)頁面組件,用來測試router的跳轉(zhuǎn)。
上一章的src目錄 現(xiàn)在的src目錄
  • 新建了一個(gè)路由文件,src/router/index.js就是vue腳手架初始化生成的內(nèi)容了:
import Vue from "vue";
import VueRouter from "vue-router";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "home",
    component: () => import("../views/home.vue")
  },
  {
    path: "/about",
    name: "about",
    component: () => import("../views/about.vue")
  }
];

const router = new VueRouter({
  routes
});

export default router;
  • 然后需要在入口文件src/index.js中引入這個(gè)路由,還有一些其他的都是關(guān)于vue的基本使用用法的東西就不多說了,去看下倉庫源碼即可。

4、問題

  • 到了這一步以后,自然我們需要跑一下項(xiàng)目,這時(shí)候問題來了,死活這張圖片不顯示;報(bào)http://localhost:8080/[object%20Module]找不到圖片的錯(cuò)誤。
  • 經(jīng)過一頓google后終于找到了答案,原來我們需要在webpack.common.js中使用url-loader的地方把esModule設(shè)置為false-->錯(cuò)誤reason。
 // ...
 {
    test: /\.(png|jpg|gif)$/i,
    use: [
      {
        loader: "url-loader",
        options: {
          limit: 4096,
+         esModule: false
        }
      }
    ]
  }
  • 學(xué)點(diǎn)東西還是挺不容易啊,坑真多。。。。終于,看到了完整的頁面,路由跳轉(zhuǎn)頁也沒問題。


5、小結(jié)

  • 嗯,回想過去第一次用vue-cli腳手架搭起頁面的時(shí)刻,是不是有那味了?react也是差不多,裝下react react-dom,但是由于我react的技術(shù)棧不是很熟,就不班門弄斧了,用create-react-app這個(gè)官方腳手架初始化搞個(gè)項(xiàng)目,原理也都一樣。
  • 至此,我們也從0到了1的配置了一個(gè)跟vue-webpack-template這樣的模板項(xiàng)目出來了,雖然比不上官方,但也算是有模有樣的。
  • 參考鏈接:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容