vue+webpack4+webpack-dev-server的配置

跟着慕课网的Jokcy老师做了一个todo项目,其实详细描述了webpack+vue的环境搭建。大概由于版本问题,遇到了一些课程中没显示出的error,通过上网搜索查出了解决方式。用这篇文章完整记录下自己的配置过程,以便后续参考。

vuscode插件

视频开头推荐下载这些插件,便于vscode的编程。打算之后出一篇文章查询记录一下这些插件的功能。(我先都安装了)
接下来是正式配置流程:
(1)初始化项目:
操作:使用ctrl+‘·’打开命令行,输入npm init,选项皆默认
结果:初始化成一个npm项目,形成package.json文件
(2)安装需要的包:
操作:npm i webpack vue vue-loader(使用vue,需要安装vue-loader)
结果
显示出警告:vue-loader需要安装css-loader作为第三方依赖

解决操作:npm i css-loader
这些warn不用理

(3)新建文件夹‘src’,作为源码放置的目录;在src下新建文件‘app.vue’;在app.vue组件中输入以下内容
app.vue

(4)要想办法,让app.vue组件在浏览器中运行、显示:
操作:新建文件‘webpack.config.js’
(webpack的作用:打包前端资源;要以js文件为入口,此处申明入口)
操作:在src文件夹下新建‘index.js’,作为入口文件。vue组件通过js入口文件,挂载到html页面中;
在index.js中实现挂载操作:
index.js 实现挂载 在html页面中展示vue组件的内容

在webpack.config.js中配置入口、出口,打包vue组件与入口js文件的内容,形成bundle.js文件:
webpack.config.js 使用webpack进行打包并生成打包文件

在package.json里面写一句脚本:
(指定config文件:--config webpack.config.js)
只有在此处用webpack,才会用项目中配置的webpack,而不是用全局的webpack(如果直接在命令行里面输入,则会调用全局的webpack。全局的webpack可能与我们使用的webpack版本不一样)
package.json

配置好了以后,在命令行中输入npm run build(进行打包)。会提示安装webpack-cli,安装后继续运行,有warning:
mode

错误原因:webpack4里面需要声明mode来判断是生产环境还是开发环境
解决办法:修改build:
"build": "webpack --mode=production --config webpack.config.js"
依旧有错误:
这个报错说明需要配置loader

报错原因:原生webpack只支持js文件类型,在使用超出其理解范围的语法时,要配置必要的loader
配置必要的loader:

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

依然有错误:

提示webpack4配置需要包含VueLoaderPlugin

声明VueLoaderPlugin:
const VueLoaderPlugin = require('vue-loader/lib/plugin')
然后在输出里面配置plugins:

plugins: [
    new VueLoaderPlugin()
  ]

同时npm i vue-template-compiler

依然有错误:

没有安装style-loader

npm i style-loader
再次npm run build,未报错,搞定!
看结果:生成了一个dist文件夹,下面有bundle.js文件,里面是经由webpack压缩的页面信息。
bundle.js 我生成的内容有点奇怪,不知道是不是版本问题

(5)webpack配置项目加载各种静态资源及css预处理器
前面都是用webpack来加载.vue文件,现在是用webpack打包各种静态资源还有图片、样式之类的。
样式代码的loader之前已经配置好了(style-loader、css-loader)
还需要配置图片:

{
        // 图片有各种格式,会用到的都要列出来
        test: /\.(gif|jpg|jpeg|png|svg)$/,
        use: 
          {
            // use中,loader可以配置选项。方法:使用对象去声明
            loader: 'url-loader',
            //使用options去声明,将其中的对象传给loader
            options: {
              // 限制开始转译的大小,小的图片则不用转译,减少HTTP请求
              limit: 1024,
              // 自定义转译的文件名称
              // ext表示文件的扩展名
              name: '[name]-moira.[ext]'
            }
          }
      }

安装相应的loader:
npm i url-loader file-loader(url-loader依赖于file-loader)
配置、安装完毕loader时,就可以在js代码中直接import这些非js内容:

完成这样的文件夹创建:放置图片、样式

创建文件

在样式文件中写点东西:

body{
  color: red;
  background-image: url('../images/back.jpg')
}

在入口文件(index.js)中import进去:

import './assets/styles/test.css'
import './assets/images/back.jpg'

运行:


生成了指定格式的转译图片

接下来配置css与处理器:(stylus 可以使用模块化的方式去写css代码)
在webpack.config.js中配置loader:

{
        test: /\.styl$/,
        use: [
          'style-loader',
          'css-loader',
          // 用stylus处理完的,是css内容。要处理css内容,必须返回上一级,到HTML页面中找样式
          // 所以需要以上两个loader
          // webpack的内容就是一层一层往上扔的,所以可以多种loader进行搭配
          'stylus-loader'
        ]
}

配置好以后安装所需loader:
npm i stylus stylus-loader
接下来就可以用styl文件写样式了:
在styles文件夹中创建test-stylus.styl文件,写一些样式(这里之前安装的stylus插件就有用了):

body 
  font-size: 20px

可以看出,比css文件少了很多格式,更加方便了
写完之后,在入口文件中引入:
import './assets/styles/test-stylus.styl'
打包一下:npm run build 显示成功
(6)webpack-dev-server的配置和使用
webpack-dev-server专门用在开发环境(mode=development)
ps:生产环境(mode=production)
npm i webpack-dev-server
配置脚本:"dev": "webpack-dev-server --mode=development --config webpack.config.js"
修改webpack的配置,来适应webpack-dev-server的开发模式:

//在全局加入编译目标:web平台(网站,跑在浏览器中)
  target: 'web',

配置文件同时用在生产、开发环境,配置中需要进行判断。判断方法:在脚本中设置环境变量,进行标识。
npm i cross-env 作用:在不同平台,设置环境变量的方式不一样(如mac与windows)。使用cross-env,则可在不同平台执行同个语句来设置环境变量。
配置脚本:

"build": "cross-env NODE_ENV=production webpack --mode=production --config webpack.config.js",
"dev": "cross-env NODE_ENV=development webpack-dev-server --mode=development --config webpack.config.js"

判断环境变量:

// 判断process.env.NODE_ENV是否等于development,以此判断isDev是否为true
// 在启动脚本的时候设置的环境变量全部存于process.env这个对象里面
const isDev = process.env.NODE_ENV === 'development'
module.exports

把module.exports改为const config,然后再加上:
module.exports = config
原因:要使用判断,需要用const

if (isDev) {
  // 在config上加一个devServer配置
  config.devServer= {
    // 启动的服务端口
    port: 8000,
    // 通过localhost或IP进行访问
    host: '0.0.0.0',
    // 若编译过程中有错误,显示到网页上,便于定位错误
    overlay: {
      errors: true,
    },
      //热加载
      hot: true
  }
}

接下来,我们需要在编译结果的文件夹中加一个HTML文件来容纳js文件。
安装所需插件(使用webpack形成html文件):
npm i html-webpack-plugin

引入:
// 引入webpack的形成html插件
const HTMLPlugin = require('html-webpack-plugin')

使用(在webpack全局中配置):

 plugins: [
    // 使用vue框架时,一定要用以下这个webpack的plugin
    // 在里面定义一个变量
    // 作用:可以在全局调用变量来判断环境,变量为:process.env.NODE_ENV 返回结果为"development" or "production"(双引号不可省略)
    // 这里调用了webpack插件,所以需要引入一下
    new webpack.DefinePlugin({
      'process.env': {
        // 判断是否isDev,若是,则为development;若不是,则为production
        NODE_ENV: isDev ? '"development"' : '"production"' 
      }
    }),
    new VueLoaderPlugin(),
    new HTMLPlugin()
  ]
// 引入webpack
const webpack = require('webpack')

配置完毕,使用npm run dev运行,进入页面,成功显示vue组件的内容。
说明webpack-dev-server已经成功启用了页面。
下面介绍一些webpack-dev-server的其他功能:

if (isDev) {
  // 在config上加一个devServer配置
  config.devSever = {
    // 启动的服务端口
    port: 8000,
    // 通过localhost或IP进行访问
    host: '0.0.0.0',
    // 若编译过程中有错误,显示到网页上,便于定位错误
    overlay: {
      errors: true,
    },
      //热加载,功能:只渲染所改组件的页面效果,不会全部刷新,其他页面数据依然会存在
      hot: true,
      // 运行时自动打开页面,但修改时会总是打开,不太好,所以看具体业务需要
      // open: true
      // 单页应用会做很多前端路由,请求进来的地址不一定是index.html。
      // historyFallback能将所有没有做映射的地址都映射到一个入口:index.html中去。
      // 课程中只是提到这个功能,没有讲详细配置
      // historyFallback: {
      // }
  },
  // 加插件,push一个新的webpack plugin
  //下面是不刷新更新内容
  config.plugins.push(
      // 启动热更新功能插件
      new webpack.HotModuleReplacementPlugin(),
      // 帮助减少不需要的信息展示
      new webpack.NoEmitOnErrorsPlugin()
    )
}

在webpack-dev-server上增加配置:

// 在config上加一个devtool配置
  // 作用:在页面上调试代码,使用source-map映射编译代码
  config.devtool = '#cheap-module-eval-source-map'

重启:npm run dev
成功展示页面,附带热更新功能:


访问网址为:localhost:8000

整个配置过程中参考的大佬地址:

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

推荐阅读更多精彩内容

  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,647评论 0 16
  • 小的时候,一直特别喜欢画画,慢慢有了生活压力,很长时间的放下了… 而立之年,一直觉得生活需要有所改变,重拾画笔让我...
    阳光正好的我阅读 211评论 2 0
  • 感赏昨晚睡觉的时候儿子轻轻的刷碗,洗澡的时候开门关门也是轻手轻脚的,感赏儿子能够体谅妈妈睡眠不好,真是一个体贴细心...
    李沁李沁阅读 265评论 0 3
  • 顾仲平阅读 220评论 0 5
  • 这是一个闷热的夏,所有人身上都被汗液的粘腻所充斥。昆明怕也还算得好,干热之地的夏风还带着一丝清凉和舒爽。 终归是入...
    頗黎RaNs阅读 22,101评论 15 18