webpack4+vue+vuex+vue-router 搭建vue开发环境

记录一下自己使用 webpack4 搭建vue环境的步骤,仅供参考。

一、创建目录

1.创建项目目录并且初始化项目

mkdir Webpack-Vue
cd Webpack-Vue
npm init -y
  1. 创建项目内子目录
mkdir src src/components dist

dist 用于存放 Webpack 打包后的项目文件、src 用于存放源代码文件

  1. 创建入口文件
touch src/main.js
touch src/index.html

index.html中添加如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"></div>
</body>
</html>

二、安装webpack

npm i webpack webpack-dev-server webpack-cli webpack-merge -D

三、配置webpack

npm i terser-webpack-plugin@4.1.0 html-webpack-plugin@3.2.0 -D

创建如下文件,用来配置webpack


touch webpack.config.js webpack.dev.js webpack.prod.js

接下来编写配置文件

  1. webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
  // 输入
  entry: {
    bundle: path.resolve(__dirname, './src/main.js')
  },
  // 输出
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].[hash].js'
  },
  module: {
    rules: []
  },
  resolve: {
    alias: {},
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './src/index.html'),
      filename: "index.html",
      title: 'webpack-vue',
      minify: {// 压缩HTML文件
        removeComments: true, // 移除HTML中的注释
        collapseWhitespace: true, // 删除空白符与换行符
        minifyCSS: true// 压缩内联css
      }
    }),
  ]
}

  1. webpack.dev.js
const path = require('path');
const webpackMerge = require('webpack-merge');
const webpackConfig = require('./webpack.config');

module.exports = webpackMerge(webpackConfig, {
  mode: 'development',
  devtool: 'inline-source-map',
  devServer: {
    contentBase: path.resolve(__dirname, './dist'),
    open: true,
    compress: true,
    host: "0.0.0.0",
    port: 8080
  }
})
  1. webpack.prod.js
const webpackMerge = require('webpack-merge');
const webpackConfig = require('./webpack.config');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = webpackMerge(webpackConfig, {
  mode: 'production',
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin({
      test: /\.js(\?.*)?$/i,
    })],
  },
})
  1. 编写package.json scripts 脚本

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.prod.js",
    "start": "webpack-dev-server --open --config webpack.config.js"
  },

控制台运行:

npm run start

四、 安装 Vue及Vue-router:

  1. 安装vue
npm i vue --save

修改 main.js 文件:

import Vue from 'vue';
import App from './App';
new Vue({
  el:'#app',
  template:'<App/>',
  components: { App }
});

同级目录下创建一个 App.vue 文件

<template>
  <h1>Hello World!</h1>
</template>
<script>
  export default {
    name: 'App'
  }
</script>
<style>
  html, body {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
    font-size: 16px;
  }

</style>

  1. 添加vue-router

首先控制台安装vue-router依赖包:

npm install vue-router --save

在src目录下创建router文件夹并在此文件夹下创建index.js文件:

mkdir src/router && touch src/router/index.js

在router/index.js中编写如下代码:

import Vue from 'vue'
import VueRouter from 'vue-router'
// 组件
import Home from '../components/home/Home.vue'
Vue.use(VueRouter)
export default new VueRouter({
  routes: [{
    path: '/',
    name: 'Home',
    component: Home
  }]
})

创建Home组件:

mkdir src/components/home && touch src/components/home/Home.vue

home组件中添加代码:

<template>
  <div class="Home">
    homePage
  </div>
</template>
<script>
  export default {
    name: 'home',
    data() {
      return {}
    },
  }
</script>
<style lang="less">
</style>

在main.js中修改代码:

import Vue from 'vue';
import App from './App.vue';
import router from './router';

Vue.config.debug = true;//开启错误提示

//系统错误捕获
const errorHandler = (error, vm) => {
  console.error('全局异常:', error);
  Activity.saveLog('全局异常:', error)
}
Vue.config.errorHandler = errorHandler;

new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

在App.vue中修改代码:

<template>
  <div>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: "App"
};
</script>
<style>
html,
body {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  font-size: 16px;
}
</style>

五、引入各种loader

  1. babel-loader

为了使 JavaScript 代码兼容更多环境,需要使用 babel-loader。

配置方法:

安装 babel-loader、babel-preset-env 和 babel-core。 babel-loader 是 7.x 版本的话,babel-core 必须是 6.x 版本; babel-loader 是 8.x 版本的话, babel-core 必须是 7.x 版本。

安装命令如下:

npm i babel-loader@7 babel-core babel-preset-env -D

然后在 webpack.config.js 的 module.rules 中新增


{
  test: /\.js$/,
  use:'babel-loader',
  exclude: /node_modules/
}

添加一个配置文件(.babelrc)在根目录下:


{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }]
  ]
}

  1. file-loader

这个用于将字体文件、图片文件进行模块化。首先安装 file-loader:

npm i file-loader -D

在 webpack.base.conf.js 中配置module.rules:

{

  test: /\.(png|svg|jpg|gif)$/,
  use: [
  'file-loader'
  ]
},
{
  test: /\.(woff|woff2|eot|ttf|otf)$/,
  use: [
  'file-loader'
  ]
}
  1. vue-loader

安装 vue-loader、css-loader、vue-style-loader 和 vue-template-compiler


npm i vue-loader css-loader vue-style-loader vue-template-compiler -D

配置 webpack.base.conf.js

{
  test: /\.vue$/,
  loader:'vue-loader'
},
{
  test: /\.css$/,
  use: ['vue-style-loader','css-loader']
}

在头部引入:

const VueLoaderPlugin = require('vue-loader/lib/plugin');

在 plugins 数组中添加这个插件

new VueLoaderPlugin(),

配置别名,将 resolve.alias 配置:

{
  'vue$':'vue/dist/vue.esm.js',
  '@': path.resolve(__dirname,'../src'),
}

添加一个 resolve.extensions 属性:

extensions: ['*', '.js', '.json', '.vue'],
  1. babel-preset-stage-3
    安装:
npm isntall --save-dev  babel-preset-stage-3

修改.babelrc配置,在presets添加stage-3:

{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-3"
  ]
}

运行npm run start 就可以使用了

六、其他配置

  1. 打包删除上次的dist文件夹

安装clean-webpack-plugin

npm install clean-webpack-plugin --save-dev

配置webpack.config.js

//引入clean-webpack-plugin
const CleanWebpackPlugin = require('clean-webpack-plugin')
// 在plugins中配置
plugins: [new CleanWebpackPlugin(["dist"])]
  1. 多环境打包配置

一般情况下会分为开发环境、预发环境、生产环境,接下来配置一下打包环境
在src目录下创建environments目录并创建4个文件

mkdir environments
cd environments
touch environment.js environment.dev.js environment.stage.js environment.prod.js
environment.js // 打包时会把环境写入到这里
environment.dev.js // 开发环境
environment.stage.js // 预发环境
environment.prod.js // 生产环境

environment.prod.js文件中编写

export default environment = {
  apiHost: 'http://api.prod.com', // 生产环境接口地址
  sourceHost: 'http://www.prod.com', // 生产环境域名
  env: 'prod'
}

environment.stage.js文件中编写

export default environment = {
  apiHost: 'http://api.stage.com', // 预发环境接口地址
  sourceHost: 'http://www.stage.com', // 预发环境域名
  env: 'stage'
}

environment.dev.js文件中编写

export default environment = {
  apiHost: 'http://api.dev.com', // 开发环境接口地址
  sourceHost: 'http://www.dev.com', // 开发环境域名
  env: 'dev'
}

package.json文件中配置scripts

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "prestart": "cat ./src/environments/environment.dev.js > ./src/environments/environment.js",
    "start": "webpack-dev-server --open --config webpack.config.js",
    "prebuild": "cat ./src/environments/environment.prod.js > ./src/environments/environment.js",
    "build": "webpack --config webpack.prod.js",
    "prebuild:dev": "cat ./src/environments/environment.dev.js > ./src/environments/environment.js",
    "build:dev": "webpack --config webpack.prod.js",
    "prebuild:stage": "cat ./src/environments/environment.stage.js > ./src/environments/environment.js",
    "build:stage": "webpack --config webpack.prod.js"
  },

执行命令就可以按环境打包了,如:

npm run build:dev
  1. 安装vuex
npm install vuex --save

在src中目录中创建store/index.js

mkdir src/store && touch src/store/index.js

在store/index.js中编写代码:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);

export default new Vuex.Store({
  state: {},
  getters: {},
  mutations: {},
  actions: {}
})

在main.js导入并挂载到vue的实例上:

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store'

Vue.config.debug = true;//开启错误提示

//系统错误捕获
const errorHandler = (error, vm) => {
  console.error('全局异常:', error);
  Activity.saveLog('全局异常:', error)
}
Vue.config.errorHandler = errorHandler;

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

webpack配置多页面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349