这部分主要说一下如何配置我们的webpack-dev-server让我们可以在开发的过程中体验到一个非常高效又非常方便的开发模式,提高我们的开发效率,webpack-dev-server是webpack的包,首先需要安装这个webpack包

➜  vue-demo npm install webpack-dev-server@2.9.7
npm WARN vue-demo@1.0.0 No repository field.

+ webpack-dev-server@2.9.7
added 226 packages from 129 contributors and audited 5529 packages in 12.901s
found 5 vulnerabilities (2 low, 1 moderate, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details
➜  vue-demo

安装包安装好以后,需要在package.json文件中添加一条指令用来启动webpack-dev-server

我们使用同一份webpack配置文件,webpack-dev-server可以给我们带来不同的效果,它是专门用在开发环境的,当然我们也需要去修改一些webpack的配置,来专门适应我们的webpack-dev-server的开发模式,那么这里面我们怎么去做呢?

1. 首先在webpack.config.js文件中的配置中添加target配置,设置target: 'web' 因为我们开发的是前端的项目,我们跑在浏览器里面的,所以我们webpack的编译目标是web平台

因为我们的这份配置是既要用在正式环境又要使用在开发环境,因此需要根据不同的环境去判断使用不同的配置信息,那么我们如何去判断呢?我们可以根据在跑npm script的时候给它设置一个环境变量来标识我们当前是开发环境还是正式环境,那么这个变量我们如何设置呢?我们可以借助一个webpack包cross-env这个包,为什么要使用这个包呢?因为不同平台上我们设置环境变量的方式是不一样的,我们不想为不同的平台编写不同的命令,所以我们借助使用这个包来处理不同平台的差异。

1.1 安装cross-env

➜  vue-demo npm install cross-env
npm WARN vue-demo@1.0.0 No repository field.

+ cross-env@5.2.0
added 3 packages from 2 contributors and audited 5539 packages in 4.487s
found 5 vulnerabilities (2 low, 1 moderate, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details
➜  vue-demo

1.2 修改npm script脚本,为不同的指令指定不同的环境变量

1.3 在webpack.config.js文件中读取npm script脚本命令携带的环境变量,脚本命令中设置的环境变量都会存在process.env这个对象里面,因此我们可以通过这个对象拿到我们设置的所有环境变量,然后进行判断来处理不同环境下的配置信息

const path = require('path')

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

const config = {
    target: 'web',
    entry: path.join(__dirname, 'src/index.js'),
    output: {
        filename: 'bundle.js',
        path: path.join(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },
            {
                test: /\.styl$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'stylus-loader'
                ]
            },
            {
                test: /\.(gif|jpg|jpeg|png|svg)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 1024,
                            name: '[name]-image.[ext]'
                        }
                    }
                ]
            }
        ]
    }
}

if (isDev) {
    config.devServer = {
        port: 9999,
        host: '0.0.0.0', // 设置值:0.0.0.0的好处,可以通过localhost访问,也可以通过127.0.0.1访问,还可以通过本机的ip进行访问
        overlay: {
            errors: true // 如果在webpack编译的过程中有任何的错误直接输出到页面上
        }
    }
}

module.exports = config

1.4 借助插件html-webpack-plugin来生成html文件并包含编译打包后的js等资源

1.4.1 安装插件包

➜  vue-demo npm install html-webpack-plugin@2.30.1
npm WARN vue-demo@1.0.0 No repository field.

+ html-webpack-plugin@2.30.1
added 31 packages from 20 contributors and audited 5598 packages in 6.359s
found 5 vulnerabilities (2 low, 1 moderate, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details
➜  vue-demo

1.4.2 配置插件

1.5 我们使用Vue、React这些框架的时候,我们一定要去使用一个webpack的plugin,这个plugin叫webpack.DefinePlugin,这个插件使用来做什么的呢?它是给我们的webpack在编译的过程当中以及在我们的页面上和我们自己编写的js代码的时候,如果想要去判断当前项目的环境,我们都可以通过调用process.env.NODE_ENV来获取环境信息进行逻辑判断,也就是说在这里面定义的变量信息在我们编写的代码中是可以引用到的。提醒一点就是现在Vue及React这些框架的代码,它们会根据不同的环境去进行区分打包,Vue的dist目录里面有非常多的不同版本的Vue的源代码,然后在开发环境它是一个比较大的版本,它里面会包含很多错误信息的提示以及很多的功能,而这些功能在正式环境下是没必要去使用的,因为一方面它会加大文件的大小,另外一方面它会让代码的运行效率降低很多,所以我们在开发环境就使用development这时好处有很多,比如Vue会给我们很多开发错误的提醒,但是在正式环境我们不希望这些代码去使用,所以我们要使用这个变量去进行环境的区分,因为webpack再去打包的过程中也会根据这个变量去区分源代码的版本去打包进去。需要注意procee.env.NODE_ENV的值需要带双引号,否则就是procee.env.NODE_ENV = development 而不是 procee.env.NODE_ENV = "development" 就会出错。

1.6 执行启动webpack-dev-server的指令

➜  vue-demo npm run dev

> vue-demo@1.0.0 dev /Users/a1/Documents/workspace/vue-demo
> cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js

Project is running at http://0.0.0.0:9999/
webpack output is served from /
No parser and no filepath given, using 'babel' the parser now but this will throw an error in the future. Please specify a parser or a filepath so one can be inferred.
Hash: 0a60bfb8c38fce0e54d5
Version: webpack 3.10.0
Time: 1462ms
            Asset       Size  Chunks                    Chunk Names
beijing-image.jpg     902 kB          [emitted]  [big]
        bundle.js     586 kB       0  [emitted]  [big]  main
       index.html  182 bytes          [emitted]
   [5] multi (webpack)-dev-server/client?http://0.0.0.0:9999 ./src/index.js 40 bytes {0} [built]
   [6] (webpack)-dev-server/client?http://0.0.0.0:9999 7.95 kB {0} [built]
   [7] ./node_modules/url/url.js 23.3 kB {0} [built]
  [14] ./node_modules/strip-ansi/index.js 161 bytes {0} [built]
  [16] ./node_modules/loglevel/lib/loglevel.js 7.86 kB {0} [built]
  [17] (webpack)-dev-server/client/socket.js 1.05 kB {0} [built]
  [19] (webpack)-dev-server/client/overlay.js 3.73 kB {0} [built]
  [24] (webpack)/hot nonrecursive ^\.\/log$ 170 bytes {0} [built]
  [26] (webpack)/hot/emitter.js 77 bytes {0} [built]
  [28] ./src/index.js 280 bytes {0} [built]
  [29] ./node_modules/vue/dist/vue.runtime.esm.js 209 kB {0} [built]
  [33] ./src/app.vue 1.81 kB {0} [built]
  [40] ./src/assets/css/index.css 1.03 kB {0} [built]
  [44] ./src/assets/css/index.styl 1.17 kB {0} [built]
  [46] ./src/assets/images/beijing.jpg 63 bytes {0} [built]
    + 32 hidden modules
Child html-webpack-plugin for "index.html":
     1 asset
       [0] ./node_modules/html-webpack-plugin/lib/loader.js!./node_modules/html-webpack-plugin/default_index.ejs 538 bytes {0} [built]
       [1] ./node_modules/lodash/lodash.js 541 kB {0} [built]
       [2] (webpack)/buildin/global.js 509 bytes {0} [built]
       [3] (webpack)/buildin/module.js 517 bytes {0} [built]
webpack: Compiled successfully.

1.7 打开浏览器访问,可以成功访问页面了~

1.8 接下去我们还需要配置我们的hot,这个配置是用来做什么的呢?hot是webpack的一个功能,这个功能其实就是HotModuleReplacement模块热替换,在我们开发单页应用的时候我们页面上会有很多的数据,如果我们每次修改代码整个页面都刷新了,就会导致我们整个页面上面所有的数据都没了,我们需要再重新操作一遍很多数据才会回来,这样非常不利于提升开发效率,所以这个hot功能就是我们如果修改了一个组件的代码,我们只需要重新渲染当前页面中这个组件的效果,它不会让我们整个页面都重新加载,那么页面上的所有数据都依然会存在,能够很好的提升开发效率。

其实正常来讲,我们配置完成后还需要在页面上去写一些处理热加载过程的代码,因为我们要怎么去处理热加载回来的代码是我们自己去定的,但是因为我们使用的是Vue去进行开发,然后Vue都是Vue组件的这种开发模式,这种开发模式我们使用vue-loader它自动帮我们加载了模块这些功能,所以这些功能已经存在了就不需要我们再去自己手动编写了。

重新启动webpack-dev-server,修改组件代码浏览器不会重新刷新,只有组件会重新渲染,大功告成!!!

1.9 配置开发环境的devtool

首先介绍一下这个开发工具,它是用来在页面上调试我们代码的时候使用的,因为我们使用的.vue文件的开发模式,而且我们写的都是ES6的代码,这些代码在浏览器里面是不能直接运行的,所以我们如果直接去调试浏览器里面的代码,这些代码都是经过编译的可能我们自己都看不懂,那么我们使用的方式就是我们使用SourceMap去进行代码的映射,然后我们调试的时候发现打开还是我们正常编写的代码,这样我们调试起来也比较的方便,更有利于我们快速定位问题,这个功能webpack已经帮我们提供了,我们可以通过配置devtool来设置,我们常用的配置就是#cheap-module-eval-source-map这个,不同的模式有不同的优点,比如#source-map它可以最完整的映射编写的代码与编译后的代码的关系,但是它的效率非常的低,它的文件非常的大,所以导致我们的webpack编译的比较慢,我们在页面上去调试的时候速度也比较慢,如果使用#eval就是使得页面上的整个代码看起来比较乱,就是会出现行对应不齐的这种问题,会使得我们定位问题变得困难,因此webpack官方推荐使用#cheap-module-eval-source-map这个配置,一方面它的效率比较高,一方面准确性也比较高,所以我们使用这个配置即可。

Logo

前往低代码交流专区

更多推荐