Webpack+Vue手動(dòng)搭建

前言

看了很多童鞋關(guān)于用webpack手動(dòng)搭建vue項(xiàng)目的文章训枢,自己從中也學(xué)到了一些,在這里做個(gè)小的栗子醉旦,供以后學(xué)習(xí)拓展饶米,有總結(jié)不周的地方,大家可以提一些建議车胡,多多益善

一檬输、Webpack

在搭建Vue項(xiàng)目前,我們需要先了解一下webpack是干啥的匈棘,大家可以去 webpack中文文檔 進(jìn)行系統(tǒng)型的學(xué)習(xí)丧慈,在下面的配置中也會(huì)說(shuō)到這些關(guān)鍵的配置詞語(yǔ),由于咱們主要講的是用Webpack來(lái)搭建Vue項(xiàng)目主卫,所以在這里關(guān)于Webpack的一些詳細(xì)介紹各位童鞋闊以下去補(bǔ)補(bǔ)課逃默。

二、步入正題

1.初始化項(xiàng)目 npm init
初始化.jpg

使用 npm init 指令創(chuàng)建項(xiàng)目描述文件 package.json簇搅,命令行里面會(huì)以問(wèn)答的形式來(lái)填一些項(xiàng)目的介紹信息完域,下面我們依次來(lái)看一下:

介紹信息 釋意
package name 項(xiàng)目名稱
version 版本號(hào)
description 描述信息
entry point 入口文件
test command 項(xiàng)目啟動(dòng)時(shí)腳本命令
git repository Git地址,可以把當(dāng)前項(xiàng)目放到Git倉(cāng)庫(kù)里
keywords 關(guān)鍵字
author 作者的名稱
license 項(xiàng)目要發(fā)行的時(shí)候需要的證書

現(xiàn)在我們打開(kāi)package.json瘩将,就可以看到剛剛的項(xiàng)目介紹信息

2.創(chuàng)建項(xiàng)目需要的基礎(chǔ)文件夾以及基礎(chǔ)文件
  • 手動(dòng)創(chuàng)建
  • 復(fù)習(xí)一下liunx命令
    • mkdir [文件夾名稱] 創(chuàng)建文件夾
    • touch [文件名稱] 創(chuàng)建文件

目前創(chuàng)建完的目錄是醬的:

文件目錄.jpg
名稱 釋意
config 項(xiàng)目配置文件夾
webpack.config.js webpack配置文件
src 項(xiàng)目源碼文件夾
assets 靜態(tài)資源(圖片吟税、樣式)文件夾
components 路由文件夾
App.vue 根文件
main.js 項(xiàng)目入口文件
index.html 頁(yè)面入口文件
package.json 依賴文件
3. 按照webpack以及一系列的依賴文件 npm install
{
  "name": "vuedemo",
  "version": "1.0.0",
  "description": "webpack + vue demo",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "dependencies": {
    "html-webpack-plugin": "^3.2.0",
    "vue": "^2.6.10"
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "cross-env": "^5.2.0",
    "css-loader": "^3.0.0",
    "style-loader": "^0.23.1",
    "url-loader": "^2.0.0",
    "vue": "^2.6.10",
    "vue-loader": "^15.7.0",
    "vue-template-compiler": "^2.6.10",
    "webpack": "^4.34.0",
    "webpack-cli": "^3.3.4",
    "webpack-dev-server": "^3.7.1"
  },
  "author": "xiaowu",
  "license": "ISC"
}
我們首先來(lái)看一下package.json里面的devDependencies和dependencies的區(qū)別:
  • devDependencies
    開(kāi)發(fā)應(yīng)用時(shí)所依賴的工具包关噪。通常是一些開(kāi)發(fā)、測(cè)試乌妙、打包工具使兔,例如 webpack。應(yīng)用正常運(yùn)行并不依賴于這些包藤韵,用戶在使用 npm install 安裝你的包時(shí)也不會(huì)安裝這些依賴虐沥。
  • dependencies:
    應(yīng)用能夠正常運(yùn)行所依賴的包,用戶在使用 npm install 安裝你的包時(shí)會(huì)自動(dòng)安裝這些依賴泽艘。
看一下開(kāi)發(fā)環(huán)境下所依賴的工具包:
依賴名稱 釋意
babel-core欲险、babel-loader 安裝babel的轉(zhuǎn)換工具包
cross-env 配置三種環(huán)境(開(kāi)發(fā)、測(cè)試匹涮、生產(chǎn))打包
css-loader天试、style-loader css依賴 將css解析成模塊,將解析的內(nèi)容插入到頁(yè)面
file-loader然低、url-loader 解析圖片 能夠?qū)D片轉(zhuǎn)成base64代碼直接寫在js里面
html-webpack-plugin 以我們自己的html為模板將打包后的結(jié)果喜每,自動(dòng)引入到html中產(chǎn)出到dist目錄下
stylus、stylus-loader css預(yù)處理器
vue-loader 處理.vue文件
vue-template-compiler 解析template模塊
webpack-dev-server 內(nèi)置一個(gè)服務(wù) 可以啟動(dòng)一個(gè)端口號(hào)雳攘,當(dāng)代碼更新時(shí)可以自動(dòng)打包(內(nèi)存中打包)
4.配置 webpack.config.js
const path = require('path'); // 路徑處理模塊 nodeJs基本包
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const webpack = require("webpack");
const HtmlWebpackPlugin = require('html-webpack-plugin') // html解析插件
module.exports = {
    entry: path.resolve(__dirname,"../src/main.js"), // 項(xiàng)目總?cè)肟趈s文件 __dirname表示當(dāng)前文件的路徑
     // 輸出文件
     output: {
        path: path.resolve(__dirname, 'dist'), // 所有的文件都輸出到dist/目錄下
        filename: '[name].[hash].js'
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
                        // the "scss" and "sass" values for the lang attribute to the right configs here.
                        // other preprocessors should work out of the box, no loader config like this necessary.
                        'scss': 'vue-style-loader!css-loader!sass-loader',
                        'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
                    }
                    // other vue-loader options go here
                }
            },
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.css$/i,
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.styl/,
                use: [
                    'style-loader',
                    'css-loader',
                    'stylus-loader'//這個(gè)loader依賴stylus這個(gè)包带兜,所以裝的時(shí)候還要安裝這個(gè)stylus
                ]
            },
            {
                test: /\.(png|jpg|gif|svg)$/,
                loader: 'url-loader', // 能夠?qū)D片轉(zhuǎn)成base64代碼直接寫在js里面,依賴file-loader,所以在安裝的時(shí)候不僅要裝url-loader還要裝file-loader
                options: {
                    name(file) {
                        if (process.env.NODE_ENV === 'development') {
                        return '[path][name].[ext]';
                        }

                        return '[hash].[ext]';
                    },
                    limit: 8192,
                    outputPath: "dist/images/"  
                }
            }
        ]
    },
    plugins: [
        new VueLoaderPlugin(), // 最新版的vue-loader需要配置插件
        // 具體配置https://github.com/jantimon/html-webpack-plugin
        new HtmlWebpackPlugin({
            filename: process.env.NODE_ENV === "production" ? '../index.html' : "index.html", // 生成html文件的名字吨灭,默認(rèn)為index.html
            template: 'index.html', // 當(dāng)webpack自動(dòng)生成html文件的時(shí)候刚照,會(huì)基于某個(gè)模板來(lái)進(jìn)行
            inject: "body", // 所有javascript資源將被放置在body元素的底部
            chunks: ["main"] // 只添加main.js/main.css
        })
    ],
    // http://www.reibang.com/p/62dc120d96d0
    // 使用eval打包源文件模塊,在同一個(gè)文件中生成干凈的完整的source map喧兄。這個(gè)選項(xiàng)可以在不影響構(gòu)建速度的前提下生成完整的sourcemap无畔,但是對(duì)打包后
    // 輸出的JS文件的執(zhí)行具有性能和安全的隱患。不過(guò)在開(kāi)發(fā)階段這是一個(gè)非常好的選項(xiàng)吠冤,但是在生產(chǎn)階段一定不要用這個(gè)選項(xiàng)浑彰;
    devtool: '#eval-source-map', // 調(diào)試
    // 模塊resolve的規(guī)則
    resolve: {
         // 配置路徑別名,比如import Vue from 'vue/dist/vue.common.js'--> import Vue from 'vue'
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        }
    },
    devServer: {
        historyApiFallback: true, // 不跳轉(zhuǎn)
        hot: true, // 熱加載咨演,不需要刷新頁(yè)面就能加載出來(lái)
        inline: true, // 實(shí)時(shí)刷新
        stats: { colors: true } // 終端輸出為彩色
    }
}
// 是否是生產(chǎn)環(huán)境
if (process.env.NODE_ENV === 'production') {
    //  module.exports.devtool = '#source-map'
    // http://vue-loader.vuejs.org/en/workflow/production.html
    module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
        'process.env': {
        NODE_ENV: '"production"'
        }
    }),
    new webpack.optimize.UglifyJsPlugin({
        sourceMap: true,
        compress: {
        warnings: false
        }
    }),
    new webpack.LoaderOptionsPlugin({
        minimize: true
    })
    ])
}
5.App.vue
<template>
    <div id="app">
        {{msg}}
    </div>
</template>

<script>
export default {
    name:'app',
    data(){
        return {
            msg:'HelloWorld'
        }
    }
}
</script>

<style>

</style>
6.main.js
import Vue from "vue";
import App from "./App.vue";

new Vue({
    el: '#app',
    components: {App},
    template: '<App/>',
})
7.package.json中的script中加一個(gè)命令"dev"
"dev": "cross-env NODE_ENV=development webpack-dev-server  --config ./config/webpack.config.js --open --hot"
8. 運(yùn)行 npm run dev
運(yùn)行.jpg

暫時(shí)只寫了單頁(yè)面闸昨,之后會(huì)拓展并且會(huì)總結(jié)在其中遇到的bug蚯斯,中間有不足的地方大家闊以提粗來(lái)薄风,蟹蟹~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拍嵌,隨后出現(xiàn)的幾起案子遭赂,更是在濱河造成了極大的恐慌,老刑警劉巖横辆,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撇他,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)困肩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門划纽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锌畸,你說(shuō)我怎么就攤上這事勇劣。” “怎么了潭枣?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵比默,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盆犁,道長(zhǎng)命咐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任谐岁,我火速辦了婚禮醋奠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伊佃。我一直安慰自己钝域,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锭魔。 她就那樣靜靜地躺著例证,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迷捧。 梳的紋絲不亂的頭發(fā)上织咧,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音漠秋,去河邊找鬼笙蒙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛庆锦,可吹牛的內(nèi)容都是我干的捅位。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搂抒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艇搀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起求晶,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焰雕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芳杏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矩屁,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辟宗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吝秕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泊脐。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烁峭,靈堂內(nèi)的尸體忽然破棺而出晨抡,到底是詐尸還是另有隱情,我是刑警寧澤则剃,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布耘柱,位于F島的核電站,受9級(jí)特大地震影響棍现,放射性物質(zhì)發(fā)生泄漏调煎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一己肮、第九天 我趴在偏房一處隱蔽的房頂上張望士袄。 院中可真熱鬧,春花似錦谎僻、人聲如沸娄柳。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赤拒。三九已至,卻和暖如春诱鞠,著一層夾襖步出監(jiān)牢的瞬間挎挖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工航夺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕉朵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓阳掐,卻偏偏與公主長(zhǎng)得像始衅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缭保,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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