vue+webpack 写给自己的小总结

前言
        在了解webpack之后,自己尝试了一下对vue浅显的剖析,从零创建vue项目,效果呢自然是可以正常的使用vue组件及vue-router以及vuex。不过有些地方确实不容易弄明白,比如跟着网上视频上讲的写,确实没弄出来,莫名其妙又摸不着头脑,唉~~~

简单概况

        简单来说,跑vue项目最主要是vue-loader了,不仅可以解析vue文件,还可以做许多事情,比如。。。。(vue-loader官网是如何解释的),接着需要用到VueLoaderPlugin插件等,接下来会写到如何从零开始创建vue项目的。

实战

        我们新建一个文件夹,用编译器打开(小编用的是webstorm),在终端对项目初始化npm init创建package.json,然后安装webpack以及webpack cli,对没错,就是上一章的webpack最基础的操作。
        先把我们需要准备的内容下载下来

//生成package.json文件
npm init -y //-y :yes 目的不用敲回车,
//安装webpack 和webpack cli
npm i webpack webpack cli -D 
//-D 局部安装 安装到development环境里,后面一定要分清楚开发环境和生产环境,-g是全局安装
//-g 全局安装是指安装到你的用户目录下 \Users\用户名\AppData\Roaming\ 
//-D 局部安装 安装包信息写入package.json文件的devDependencies
//指安装到你的项目指定目录下 项目node_modules文件的指定目录

        安装vue的一些主要的东西(vue vue-loader vue-template-compiler )以及辅助loader

npm i vue vue-loader vue-template-compiler 
//webpack 4.x || 5.x | babel-loader 8.x | babel 7.x
npm install -D babel-loader @babel/core @babel/preset-env webpack

//--save-dev 等价于 -D
npm install --save-dev css-loader
npm install --save-dev style-loader
npm install --save-dev postcss-loader postcss autoprefixer//不要忘记呀
npm install --save-dev url-loader//需要file-loader
npm install --save-dev file-loader

//Webpack 5
npm i --save-dev html-webpack-plugin@next

//Webpack 4
npm i --save-dev html-webpack-plugin

        在package中,我们可以看到具体的安装包已经被写入,自己去package.json里头看去。

目录结构:

  • node_modules
  • src
    • assets
      • imgs
        • background.png
    • views
      • home.vue
      • index.vue
    • app.vue
    • main.js
  • package.json
  • package-lock.json
  • webpack.config.js
    暂时就这些目录!!!!!

        目录创建好以后,先来写webpack的入口文件,main.js

//main.js
import Vue from 'vue' //引入vue
import App from './app.vue' //引入app,注意,一定要加后缀

const root = document.body.appendChild(document.createElement('div'))

new Vue({
    render : (h)=>h(App)
}).$mount(root)//创建vue实例然后挂载到div上

        在main.js中我们用到了app.vue,现在要在app.vue简单的写点内容

<!--app.vue-->
<template>
    <div>
        {{text}}
    </div>
</template>
<script>
    export default {
        name:'app',
        data(){
            return{
                text : 'this is App'
            }
        }
    }
</script>
<style></style>

        接下来搞一搞webpack的东西

//webpack.config.js
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: "js/[name]-[hash:8].js"
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                    {
                        loader: "postcss-loader",
                        options: {
                            postcssOptions: {
                                plugins: [
                                    [
                                        "autoprefixer",
                                        {
                                            "browsers": [
                                                "defaults",
                                                "not ie < 11",
                                                "last 2 versions",
                                                "> 1%",
                                                "iOS 7",
                                                "last 3 iOS versions"
                                            ]
                                        },
                                    ],
                                ],
                            },
                        }
                    }
                ]
            },
            {
                test: /\.(png|jpg|jpeg|gif|svg)$/,
                loader: 'url-loader',
                options: {
                    limit:'12288'
                }
            }
        ]
    },
    plugins: [
        new VueLoaderPlugin(),
        new HtmlWebpackPlugin()
    ]
}

        VueLoaderPlugin官网说的很明白
在这里插入图片描述
        接下来直接在终端输入webpack也好,或者在package.json配置也可

//package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js"
  },
//终端输入npm run build

        过程中如果出现错误,也许是你的webpack和htmlwebpackplugin插件版本的问题,此时你看一下是否对应上述所说的重新安装,或者手动调整版本号也行

npm uninstall xxx

        webpack4的成功日志,学习的时候用的webpack5,打包后发现日志并没有webpack4详细,害~~

D:\webpackManage\test7>npm run build
[webpack-cli] Compilation finished
Hash: bd01c61d483bdfcecad1
Version: webpack 4.44.2
Time: 3514ms
Built at: 2020-12-25 10:06:47
              Asset       Size  Chunks                         Chunk Names
         index.html  212 bytes          [emitted]
js/main-bd01c61d.js   69.9 KiB       0  [emitted] [immutable]  main
Entrypoint main = js/main-bd01c61d.js
[0] (webpack)/buildin/global.js 472 bytes {0} [built]
[1] ./node_modules/vue/dist/vue.runtime.esm.js 222 KiB {0} [built]
[2] ./node_modules/timers-browserify/main.js 1.97 KiB {0} [built]
[3] ./node_modules/setimmediate/setImmediate.js 6.32 KiB {0} [built]
[4] ./node_modules/process/browser.js 5.29 KiB {0} [built]
[5] ./src/main.js + 6 modules 4.85 KiB {0} [built]
    | ./src/main.js 201 bytes [built]
    | ./src/app.vue 1.04 KiB [built]
    | ./src/app.vue?vue&type=template&id=5ef48958& 195 bytes [built]
    | ./src/app.vue?vue&type=script&lang=js& 348 bytes [built]
    | ./node_modules/vue-loader/lib/runtime/componentNormalizer.js 2.71 KiB [built]
    | ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/app.vue?vue
&type=template&id=5ef48958& 258 bytes [built]
    | ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/app.vue?vue&type=script&lang=js& 128 bytes [bui
lt]
Child HtmlWebpackCompiler:
                          Asset      Size  Chunks  Chunk Names
    __child-HtmlWebpackPlugin_0  4.02 KiB       0  HtmlWebpackPlugin_0
    Entrypoint HtmlWebpackPlugin_0 = __child-HtmlWebpackPlugin_0
    [0] ./node_modules/html-webpack-plugin/lib/loader.js!./node_modules/html-webpack-plugin/default_index.ejs 436 bytes {0} [built]

        到此为止,仅仅是利用webpack生产模式打包,接下来我们要配置开发模式进行打包。效果自然是在浏览器地址栏上输入host:port即可访问。

开发模式

        在开发模式中,我们要对webpack进行修改,告诉他此时此刻是开发模式。要用到一个非常重要的server

npm i webpack-dev-server -D

        不管是学习还是在练习过程中,都遇到了很麻烦的一件事——webpack、webpack-cli和webpack-dev-server这几个的版本问题,现在提一下我所使用的版本。

"webpack": "^4.44.2",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0"

        同样在package.json中我们对其进行修改,需要注意的是一定要加&&,否则会因为多个空格导致无法判断生产模式还是开发模式。

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    //设置生产模式
    "build": " set NODE_ENV=production&& webpack --config webpack.config.js",
    //设置开发模式
    "dev": " set NODE_ENV=development&& webpack-dev-server --config webpack.config.js"
  },

        回到我们的webpack.config.js中,对其进行判断dev or pro

const isDev = process.env.NODE_ENV === 'development'
//简单理解一下这句话
//在node中,有全局变量process表示的是当前的node进程。
//process.env包含着关于系统环境的信息。
//但是process.env中并不存在NODE_ENV这个东西。
//NODE_ENV是用户一个自定义的变量,在webpack中它的用途是判断生产环境或开发环境的依据的。
const config={
	……
	mode:isDev?'development':'production'
}

if(isDev){
	config.devServer={
	 	port:8000,
        host:'localhost',
        hot:true,//热加载
        open:true//启动时打开网页
	}
}

module.exports=config

        devServer可查看官网,运行一下试试

D:\webpackManage\test7>npm run dev

> test7@1.0.0 dev D:\项目\webpackManage\test7
>  set NODE_ENV=development&& webpack-dev-server --config webpack.config.js

i 「wds」: Project is running at http://localhost:8000/
i 「wds」: webpack output is served from /
i 「wds」: Content not from webpack is served from D:\项目\webpackManage\test7
i 「wdm」: wait until bundle finished: /
i 「wdm」: Hash: 0043a8deba1ab0c79e36
Version: webpack 4.44.2
Time: 5056ms
Built at: 2020-12-25 11:24:21
              Asset       Size  Chunks                         Chunk Names
         index.html  237 bytes          [emitted]
js/main-0043a8de.js    662 KiB    main  [emitted] [immutable]  main
Entrypoint main = js/main-0043a8de.js
[0] multi (webpack)-dev-server/client?http://localhost:8000 (webpack)/hot/dev-server.js ./src/main.js 52 bytes {main} [built]
[./node_modules/strip-ansi/index.js] 161 bytes {main} [built]
[./node_modules/vue/dist/vue.runtime.esm.js] 222 KiB {main} [built]
[./node_modules/webpack-dev-server/client/index.js?http://localhost:8000] (webpack)-dev-server/client?http://localhost:8000 4.29 KiB {main} [built]
[./node_modules/webpack-dev-server/client/overlay.js] (webpack)-dev-server/client/overlay.js 3.51 KiB {main} [built]
[./node_modules/webpack-dev-server/client/socket.js] (webpack)-dev-server/client/socket.js 1.53 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/createSocketUrl.js] (webpack)-dev-server/client/utils/createSocketUrl.js 2.91 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/log.js] (webpack)-dev-server/client/utils/log.js 964 bytes {main} [built]
[./node_modules/webpack-dev-server/client/utils/reloadApp.js] (webpack)-dev-server/client/utils/reloadApp.js 1.59 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/sendMessage.js] (webpack)-dev-server/client/utils/sendMessage.js 402 bytes {main} [built]
[./node_modules/webpack/hot sync ^\.\/log$] (webpack)/hot sync nonrecursive ^\.\/log$ 170 bytes {main} [built]
[./node_modules/webpack/hot/dev-server.js] (webpack)/hot/dev-server.js 1.59 KiB {main} [built]
[./node_modules/webpack/hot/emitter.js] (webpack)/hot/emitter.js 75 bytes {main} [built]
[./node_modules/webpack/hot/log-apply-result.js] (webpack)/hot/log-apply-result.js 1.27 KiB {main} [built]
[./src/main.js] 201 bytes {main} [built]
    + 32 hidden modules
Child HtmlWebpackCompiler:
     1 asset
    Entrypoint HtmlWebpackPlugin_0 = __child-HtmlWebpackPlugin_0
    [./node_modules/html-webpack-plugin/lib/loader.js!./node_modules/html-webpack-plugin/default_index.ejs] 436 bytes {HtmlWebpackPlugin_0} [built]
i 「wdm」: Compiled successfully.

在这里插入图片描述

VUE-ROUTER

        接下来复习一下vue-router该如何使用吧。先去vue-router官网上转一圈。[若干时间后~~~~],看完了就先安装一下vue-router吧。

npm i vue-router

        我们需要配置router.js,所以再src下新建router.js文件,配置如下。

//router.js
//注意区分routes和router
import Vue from 'vue'
import VueRouter from "vue-router"

Vue.use(VueRouter)

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

export default new VueRouter({
    routes
})

        然后到main.js里导入

import Vue from 'vue'
import App from './app.vue'
import router from "./router.js";

const root = document.body.appendChild(document.createElement('div'))

new Vue({
    router,
    render : (h)=>h(App)
}).$mount(root)

        修改一下app.vue

<!--app.vue-->
<template>
    <div class="app">
        <div class="link">
            <router-link to="/index">index|</router-link>
        </div>
        <div class="link">
            <router-link to="/home">home</router-link>
        </div>
        <br/>
            <router-view class="view"></router-view>
    </div>
</template>

<script>
    export default {
        name:'app',
        data(){
            return{
                // text : 'this is App'
            }
        }
    }
</script>

<style>
    .app,body{
        padding: 0;
        margin: 0;
        width: 100%;
        height: 100vh;
        background-image: url("./assets/imgs/background.png");
        background-size: cover;
        display: flex;
        flex-wrap: wrap;
        justify-content: center;

    }
    .link{
        font-size: 4vw;
        height: 5vw;
    }
    .view{
        width: 100vw;
    }
</style>

        接着在index.vue和home.vue里添加些内容

<template>
    <div>
        <h1 v-text="title"></h1>
    </div>
</template>
<script>
    export default {
        name:'index',
        data(){
            return{
                title:'This is Index.vue'
            }
        }
    }
</script>
<style>
    div{
        text-align: center;
    }
    h1{
        color: white;
    }
</style>

在这里插入图片描述

VUEX

        vuex和vue-router配置内容差别不是很大。

  • src
    • store
      • modules
        • home.js
      • index.js
//vuex-index.js
import Vue from 'vue'
import Vuex from 'vuex'
import home from './modules/home.js'

Vue.use(Vuex)

export default new Vuex.Store({
    modules:{
        home
    }
})
home.js
const state = {
    data:''
}

const getters={
    getData(state){
        return state.data
    }
}

const mutations={
    setData(state,data){
        state.data=data
    }
}

const actions = {
    changeData({commit},data){
        commit('setData',data)
    }
}

export default {
    namespaced :true,
    state,getters,mutations,actions
}
//main.js
import Vue from 'vue'
import App from './app.vue'
import router from "./router.js";
import store from './store/index'

const root = document.body.appendChild(document.createElement('div'))

new Vue({
    router,
    store,
    render : (h)=>h(App)
}).$mount(root)

        修改home.vue和index.vue

<!--index.vue-->
<template>
    <div>
        <h1 v-text="title"></h1>
        <input type="text" v-model="text" placeholder="输入内容">
        <button @click="commit">提交</button>
    </div>
</template>
<script>
    import {mapActions} from 'vuex'
    export default {
        name:'index',
        data(){
            return{
                title:'This is Index.vue',
                text:''
            }
        },
        methods:{
            ...mapActions('home',['changeData']),
            commit(){
                this.changeData(this.text)
            }
        }
    }
</script>
<style>
    div{
        text-align: center;
    }
    h1{
        color: white;
    }
</style>
<!--home.vue-->
<template>
    <div>
        <h1 v-text="title"></h1>
        <h1>{{$store.state.home.data}}</h1>
    </div>
</template>
<script>
export default {
    name:'home',
    data(){
        return{
            title:'This is Home.vue',

        }
    },
    methods:{

    }
}
</script>
<style>
    div{
        text-align: center;
    }
    h1{
        color: white;
    }
</style>

在这里插入图片描述
在这里插入图片描述

结束

        文章到此为止就结束了,另外附上我的package.json,方便以后查看版本问题哈哈嗝儿~~

//package.json
{
  "name": "test7",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": " set NODE_ENV=production&& webpack --config webpack.config.js",
    "dev": " set NODE_ENV=development&& webpack-dev-server --config webpack.config.js"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.12.10",
    "@babel/preset-env": "^7.12.11",
    "babel-loader": "^8.2.2",
    "css-loader": "^5.0.1",
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^4.5.0",
    "style-loader": "^2.0.0",
    "postcss-loader": "^4.1.0",
    "url-loader": "^4.1.1",
    "webpack": "^4.44.2",
    "webpack-cli": "^3.3.12",
    "webpack-dev-server": "^3.11.0"
  },
  "dependencies": {
    "vue": "^2.6.12",
    "vue-loader": "^15.9.6",
    "vue-router": "^3.4.9",
    "vue-template-compiler": "^2.6.12",
    "vuex": "^3.6.0"
  }
}

//webpack.js
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const isDev = process.env.NODE_ENV === 'development'

const config={
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: "js/[name]-[hash:8].js"
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                    {
                        loader: "postcss-loader",
                        options: {
                            postcssOptions: {
                                plugins: [
                                    [
                                        "autoprefixer",
                                        {
                                            "browsers": [
                                                "defaults",
                                                "not ie < 11",
                                                "last 2 versions",
                                                "> 1%",
                                                "iOS 7",
                                                "last 3 iOS versions"
                                            ]
                                        },
                                    ],
                                ],
                            },
                        }
                    }
                ]
            },
            {
                test: /\.(png|jpg|jpeg|gif|svg)$/,
                loader: 'url-loader',
                options: {
                    limit:'12288'
                }
            }
        ]
    },
    mode: isDev?'development':'production',
    plugins: [
        new VueLoaderPlugin(),
        new HtmlWebpackPlugin()
    ]
}

if(isDev){
    config.devServer={
        port:8000,
        host:'localhost',
        hot:true,
        open:true
    }
}

module.exports = config
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值