饮冰三年-人工智能-Vue-67 Webpack

上一篇:饮冰三年-人工智能-Vue-66 Vue组件化 

三、Webpack

本篇中的代码已放置到:百度网盘链接:https://pan.baidu.com/s/1I_d_tQL6DoW7BiBxIxR1Lw  提取码:6666  

1、认识webpack

  Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

   从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。

  我们从两个点来解释上面这句话:模块 和 打包

  目前使用前端模块化的一些方案:AMD、CMD、CommonJS、ES6。 在ES6之前,我们要想进行模块化开发,就必须借助于其他的工具,让我们可以进行模块化开发。 并且在通过模块化开发完成了项目后,还需要处理模块间的各种依赖,并且将其进行整合打包。 而webpack其中一个核心就是让我们可能进行模块化开发,并且会帮助我们处理模块间的依赖关系。 而且不仅仅是JavaScript文件,我们的CSS、图片、json文件等等在webpack中都可以被当做模块来使用(在后续我们会看到)。 这就是webpack中模块化的概念。 

  理解了webpack可以帮助我们进行模块化,并且处理模块间的各种复杂关系后,打包的概念就非常好理解了。 就是将webpack中的各种资源模块进行打包合并成一个或多个包(Bundle)。 并且在打包的过程中,还可以对资源进行处理,比如压缩图片,将scss转成css,将ES6语法转成ES5语法,将TypeScript转成JavaScript等等操作。

2、webpack的安装

安装webpack首先需要安装Node.js,Node.js自带了软件包管理工具npm

npm install webpack -g

安装完成之后别忘了配置环境变量,为了网速和下载方便,可以安装并使用了cnpm(后面有补充)

全局安装与局部安装

局部安装webpack

   --save-dev 是开发时依赖,项目打包后不需要继续使用的。

为什么全局安装后,还需要局部安装呢?

  在终端直接执行webpack命令,使用的全局安装的webpack

  当在package.json中定义了scripts时,其中包含了webpack命令,那么使用的是局部webpack

3、webpack的起步

创建如下文件和文件夹

 背景描述:

假设,我们mathUtils.js中有一个两个数求和的方法,我们想通过模块化的方式在main.js 中调用

3.1 首先在mathUtils.js 中写方法,在main.js中使用

// 在公共的js中定义一些个公共方法
function add(num1, num2) {
  return num1 + num2
}

// 这些方法为了能被其他的模块复用,需要将其模块化导出
// 常用的模块化方式(AMDCMDCommonJS)有很多,这里我使用ES6语法

export default add

这里涉及到了模块化的一些知识,可参考  Javascript模块化编程(一):模块的写法 

常用的模块化方式(AMDCMDCommonJS)有很多,这里我使用ES6语法

// 使用ES6语法 导入 mathUtils中的 add 方法
import add from './mathUtils.js'
//main方法中的主体内容,其实就是打印 add 计算结果
console.log(add(11,12));

同时main.js需要引入add 

3.2 webpack基本搭建

为了每个项目环境都相对孤立,我进行局部安装webpack。
但是在进行局部安装之前,考虑到npm网速太慢,决定使用cnpm安装

3.2.1 安装cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了 cnpm install [name] 

ps:如果vscode中无法使用cnpm但是在命令行验证cnpm是安装成功的,可以使用
Set-ExecutionPolicy -Scope CurrentUser
在 ExecutionPolicy中输入RemoteSigned

3.2.2 安装局部dev环境的webpack

cnpm install webpack@3.6.0 --save-dev

安装webpack,全局安装的时候用的webpack5.38.1,这里就先用3.6.0

安装完成后,会看到有node_modules 生成

3.2.3 运行webpack,将.srcmain.js  打包到 .distundle.js 

npx webpack .srcmain.js  .distundle.js

 

打包后会在dist文件下,生成一个bundle.js文件 文件内容有些复杂,这里暂时先不看,后续再进行分析。

bundle.js文件,是webpack处理了项目直接文件依赖后生成的一个js文件,我们只需要将这个js文件在index.html中引入即可

3.2.3 设置index.html页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>index</title>
</head>
<body>
  <!-- 这里原来只需要导入main.js和mathUtils 就可以了,但是现在不能这样做了(js不认识模块语法,不知道所谓的import、export啥的),必须得通过webpack打包后引用打包后的bundle.js才能运行 -->
  <script src="./dist/bundle.js"></script>
</body>
</html>

 这里原来只需要导入main.js和mathUtils 就可以了,但是现在不能这样做了,因为js不认识模块语法,不知道所谓的import、export。

所以必须得通过webpack打包后,引用打包后的bundle.js才能运行

 

4、webpack的配置

我们考虑一下,如果每次使用webpack的命令都需要写上入口和出口作为参数,就非常麻烦,有没有一种方法可以将这两个参数写到配置中,在运行时,直接读取呢?

当然可以,就是创建一个webpack.config.js文件

4.1 初始化npm包管理的文件

首先我们通过命令 npm init 生成 npm包管理的文件,也就是 package.json

package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。

4.2 创建一个webpack.config.js

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js"
  }
}

此时,只需要在终端输入webpack即可完成打包

4.3 创建package.json中定义启动

 package.json运行逻辑:

package.json中的scripts的脚本在执行时,会按照一定的顺序寻找命令对应的位置。

首先,会寻找本地的node_modules/.bin路径中对应的命令。 如果没有找到,会去全局的环境变量中寻找

5、loader的使用

loader是webpack中一个非常核心的概念。

在我们之前的实例中,我们主要是用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖。

但是,在开发中我们不仅仅有基本的js代码处理,我们也需要加载css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等。

对于webpack本身的能力来说,对于这些转化是不支持的。 那怎么办呢?给webpack扩展对应的loader就可以啦。

loader使用过程:

  1. 通过npm安装需要使用的loader
  2. 在webpack.config.js中的modules关键字下进行配置

5.1 css文件处理 

  项目开发过程中,我们必然需要添加很多的样式,而样式我们往往写到一个单独的文件中。

  在src目录中,创建一个css文件,其中创建一个normal.css文件。我们也可以重新组织文件的目录结构,将零散的js文件放在一个js文件夹中。

  normal.css中的代码非常简单,就是将body设置为red

body {
  background-color: red;
}
normal.css

  但是,这个时候normal.css中的样式会生效吗? 当然不会,因为我们压根就没有引用它。

  好的,接下在我们在main.js引用css

 重新打包,会出现如下错误:

这个错误告诉我们:加载normal.css文件必须有对应的loader。

在webpack的官方中,我们可以找到如下关于样式的loader使用方法:

 我们这里练习的版本比较老旧,安装的时候最好指定版本,安装css-loader

cnpm install --save-dev css-loader@2.0.2

css-loader只负责将css文件进行加载,style-loader负责将样式添加到DOM中,所以需要下载style-loader

cnpm install --save-dev style-loader@0.23.1

在webpack.config.js 中配置
而且使用多个loader时, webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的,所以 use: [ 'style-loader', 'css-loader' ],此时,webpack.config.js中的文件内容是这样的

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js"
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      }
    ]
  }
}
webpack.config.js

而package.json中也会多了两个引用

效果展示

 

5.2 less文件处理 

  如果我们希望在项目中使用less、scss、stylus来写样式,webpack是否可以帮助我们处理呢? 我们这里以less为例,其他也是一样的。 我们还是先创建一个less文件,依然放在css文件夹中。

@fontSize: 50px;
@fontColor: orange;

body {
  font-size: @fontSize;
  color: @fontColor;
}
special.less

  且在要在main.js中做引用  

 

  首先,还是需要安装less和对应的loader  

cnpm install --save-dev less@3.9.0
cnpm install --save-dev less-loader@4.1.0

  其次,修改对应的配置文件,添加一个rules选项,用于处理.less文件

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js"
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
    ]
  }
}
special.less

而package.json中也会多了两个引用

 效果展示

5.3 图片文件处理 

首先,我们在项目中加入两张图片,并放置到以下 src/imgs 文件夹
一张较小的图片test.jpg(11kb),一张较大的图片timg.jpeg(14kb)
待会儿我们会针对这两张图片进行不同的处理

 

我们先考虑在css样式中引用图片的情况,所以我更改了normal.css中的样式:

body {
background-color: red;
background: url(../imgs/test.jpg);
}
normal.css

图片处理,我们使用url-loader来处理,依然先安装url-loader

cnpm install --save-dev url-loader@1.1.2

修改webpack.config.js配置文件:

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js"
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
              // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
              limit: 13000,
              
            },
          }
        ]
      },
    ]
  }
}
webpack.config.js

 效果展示

那么问题来了,如果大于13kb呢?我们将background的图片改成timg.jpg,

再次build的时候报错

 这次因为大于13kb的图片,会通过file-loader进行处理,但是我们的项目中并没有file-loader

所以,我们需要安装file-loader

cnpm install --save-dev file-loader@3.0.1

再次打包,就会发现dist文件夹下多了一个图片文件

我们发现webpack自动帮助我们生成一个非常长的名字 这是一个32位hash值,目的是防止名字重复 但是,真实开发中,我们可能对打包的图片名字有一定的要求 比如,将所有的图片放在一个文件夹中,跟上图片原来的名称,同时也要防止重复

所以,我们可以在options中添加上如下选项:

  • img:文件要打包到的文件夹
  • name:获取图片原来的名字,放在该位置
  • hash:8:为了防止图片名称冲突,依然使用hash,但是我们只保留8位
  • ext:使用图片原来的扩展名

但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确 默认情况下,webpack会将生成的路径直接返回给使用者 但是,我们整个程序是打包在dist文件夹下的,所以这里我们需要在路径下再添加一个dist/

 此时的webpack.config.js

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js",
    publicPath:'dist/'
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
              // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
              limit: 13000,
              name: 'imgs/[name].[hash:8].[ext]'
            },
          }
        ]
      },
    ]
  }
}
webpack.config.js

 

5.4 ES6语法处理

如果你仔细阅读webpack打包的js文件,发现写的ES6语法并没有转成ES5,那么就意味着可能一些对ES6还不支持的浏览器没有办法很好的运行我们的代码。

如果希望将ES6的语法转成ES5,那么就需要使用babel。

首先,需要安装loader

cnpm install --save-dev babel-loader@7 babel-core babel-preset-es2015

接着、配置webpack.config.js  

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js",
    publicPath:'dist/'
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
              // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
              limit: 13000,
              name: 'imgs/[name].[hash:8].[ext]'
            },
          }
        ]
      },
      {
        test: /.js$/,
        // exclude: 排除
        // include: 包含
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['es2015']
          }
        }
      }
    ]
  }
}
webpack.config.js

效果展示

6、webpack中配置Vue

6.1 webpack + vue 初体验

我们会使用Vuejs进行开发,而且会以特殊的文件来组织vue的组件。 所以,下面我们来学习一下如何在我们的webpack环境中集成Vuejs

现在,我们希望在项目中使用Vuejs,那么必然需要对其有依赖,所以需要先进行安装 

因为我们后续是在实际项目中也会使用vue的,所以并不是开发时依赖

cnpm install vue --save

接下来就可以按照我们之前学习的方式来使用Vue了

修改完成后,重新打包,运行程序:
但是运行程序,没有出现想要的效果,而且浏览器中有报错

 我们修改webpack的配置,添加如下内容即可

效果展示 

 

6.2 template属性

正常运行之后,我们来考虑另外一个问题:

  • 如果我们希望将data中的数据显示在界面中,就必须是修改index.html
  • 如果我们后面自定义了组件,也必须修改index.html来使用组件
  • 但是html模板在之后的开发中,我并不希望手动的来频繁修改,是否可以做到呢?

通过template属性,替换index.html中的内容

效果展示

 el和template模板的关系是什么呢

  • 在我们之前的学习中,我们知道el用于指定Vue要管理的DOM,可以帮助解析其中的指令、事件监听等等。
  • 而如果Vue实例中同时指定了template,那么template模板的内容会替换掉挂载的对应el的模板。

这样做有什么好处呢

  这样做之后我们就不需要在以后的开发中再次操作index.html,只需要在template中写入对应的标签即可

6.2 Vue组件化开发引入

在学习组件化开发的时候,我说过以后的Vue开发过程中,我们都会采用组件化开发的思想。

总结一个规律:一安二改三使用

1:安装vue-loader和vue-template-compiler

cnpm install vue-loader@13.0.0 vue-template-compiler@2.5.21--save-dev

2:修改webpack.config.js的配置文件

const path = require("path") // 动态获取路径

module.exports = {
  entry: "./src/main.js",
  output: {
    path:path.resolve(__dirname,'dist'), //__dirname 表示绝对路径
    filename:"bundle.js",
    publicPath:'dist/'
  },
  module:{
    rules: [
      {
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
              // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
              limit: 13000,
              name: 'imgs/[name].[hash:8].[ext]'
            },
          }
        ]
      },
      {
        test: /.js$/,
        // exclude: 排除
        // include: 包含
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['es2015']
          }
        }
      },
      {
        test: /.vue$/,
        use: ['vue-loader']
      }
    ]
  },
  resolve: {
    // alias: 别名
    extensions: ['.js', '.css', '.vue'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
}
webpack.config.js

3:创建Vue文件夹,并添加App.vue文件

<template>
  <div class="title">
    {{ message }}
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return { message: "Hello Webpack" };
  },
 
};
</script>

<style scoped>
  .title {
    color: green;
  }
</style>
App.vue

 

 效果展示

 

4:拓展,此时如果想要再插入一个子组件

a、先添加一个Cpn.vue

<template>
  <div class="title">
    {{ message }}
    <Cpn></Cpn>
  </div>
</template>

<script>
import Cpn from './Cpn.vue'
export default {
  name: "App",
  data() {
    return { message: "Hello Webpack" };
  },
  components:{
    Cpn
  }
 
};
</script>

<style scoped>
  .title {
    color: green;
  }
</style>
Cpn.vue

b、在App.vue中做引用和子组件

<template>
  <div class="title">
    {{ message }}
    <Cpn></Cpn>
  </div>
</template>

<script>
import Cpn from './Cpn.vue'
export default {
  name: "App",
  data() {
    return { message: "Hello Webpack" };
  },
  components:{
    Cpn
  }
 
};
</script>

<style scoped>
  .title {
    color: green;
  }
</style>
App.vue

这里不用在修改index.html以及mian.js直接展示

7、plugin的使用

7.1 初识plugin

plugin是什么?

  • plugin是插件的意思,通常是用于对某个现有的架构进行扩展。
  • webpack中的插件,就是对webpack现有功能的各种扩展,比如打包优化,文件压缩等等。

loader和plugin区别

  • loader主要用于转换某些类型的模块,它是一个转换器。
  • plugin是插件,它是对webpack本身的扩展,是一个扩展器。

plugin的使用过程:

  • 步骤一:通过npm安装需要使用的plugins(某些webpack已经内置的插件不需要安装)
  • 步骤二:在webpack.config.js中的plugins中配置插件。

7.2 添加版权的Plugin

  我们先来使用一个最简单的插件,为打包的文件添加版权声明

  该插件名字叫BannerPlugin,属于webpack自带的插件。

按照下面的方式来修改webpack.config.js的文件:

7.3 打包html的Plugin

目前,我们的index.html文件是存放在项目的根目录下的。

  • 我们知道,在真实发布项目时,发布的是dist文件夹中的内容,但是dist文件夹中如果没有index.html文件,那么打包的js等文件也就没有意义了。
  • 所以,我们需要将index.html文件打包到dist文件夹中,这个时候就可以使用HtmlWebpackPlugin插件

HtmlWebpackPlugin插件可以为我们做这些事情:

  • 自动生成一个index.html文件(可以指定模板来生成) 将打包的js文件,
  • 自动通过script标签插入到body中

老流程:一安二改三使用

安装HtmlWebpackPlugin插件 

cnpm install html-webpack-plugin@3.2.0 --save-dev

使用插件,修改webpack.config.js文件中plugins部分的内容如下:

  这里的template表示根据什么模板来生成index.html 另外,

  我们需要删除之前在output中添加的publicPath属性,否则插入的script标签中的src可能会有问题

7.3 js压缩的Plugin

在项目发布之前,我们必然需要对js等文件进行压缩处理

我们使用一个第三方的插件uglifyjs-webpack-plugin,并且版本号指定1.1.1,和CLI2保持一致

cnpm install uglifyjs-webpack-plugin@1.1.1 --save-dev

修改webpack.config.js文件,使用插件

  

8、搭建本地服务器

webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现我们想要的让浏览器自动刷新显示我们修改后的结果。

老流程:一安二改三使用

它是一个单独的模块,在webpack中使用之前需要先安装它

npm install --save-dev webpack-dev-server@2.9.1

 二修改配置  

devserver也是作为webpack中的一个选项,选项本身可以设置如下属性:

  • contentBase:为哪一个文件夹提供本地服务,默认是根文件夹,我们这里要填写./dist
  • port:端口号
  • inline:页面实时刷新
  • historyApiFallback:在SPA页面中,依赖HTML5的history模式

const HtmlWebpackPlugin = require("html-webpack-plugin")
const path = require("path") // 动态获取路径
const webpack = require("webpack")
const uglifyJsPlugin = require("uglifyjs-webpack-plugin")


module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, 'dist'), //__dirname 表示绝对路径
    filename: "bundle.js",
    // publicPath:'dist/'
  },
  module: {
    rules: [{
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: ['style-loader', 'css-loader']
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [{
          loader: 'url-loader',
          options: {
            // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
            // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
            limit: 13000,
            name: 'imgs/[name].[hash:8].[ext]'
          },
        }]
      },
      {
        test: /.js$/,
        // exclude: 排除
        // include: 包含
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['es2015']
          }
        }
      },
      {
        test: /.vue$/,
        use: ['vue-loader']
      }
    ]
  },
  resolve: {
    // alias: 别名
    extensions: ['.js', '.css', '.vue'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  },
  plugins: [
    new webpack.BannerPlugin('最终版权归我所有'),
    new HtmlWebpackPlugin({
      template: 'index.html'
    }),
    new uglifyJsPlugin()
  ],
  devServer: {
    contentBase: './dist',
    inline: true //
  }
}
webpack.config.js

同时还需要修改package.json中的内容

展示效果

 

9、webpack配置分离(三家分晋)

现在生产环境和开发环境的配置全在一个webpack.config.js 中。

例如 js 代码压缩的应该属于生产环境,而在本地搭建的devServer:应该数据开发环境

我们要做的就是把webpack.config.js中公共的抽取到base.config.js,各自分配放到dev.config.js和prod.config.js

一、安装

cnpm install --save-dev webpack-merge@4.1.5

二、该配置

注意:base.config.js 中path稍加调整path.resolve(__dirname, '../dist')

const HtmlWebpackPlugin = require("html-webpack-plugin")
const path = require("path") // 动态获取路径
const webpack = require("webpack")
const uglifyJsPlugin = require("uglifyjs-webpack-plugin")


module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, '../dist'), //__dirname 表示绝对路径
    filename: "bundle.js",
    // publicPath:'dist/'
  },
  module: {
    rules: [{
        test: /.css$/,
        // css-loader只负责将css文件进行加载
        // style-loader负责将样式添加到DOM中
        // 使用多个loader时, 是从右向左
        use: ['style-loader', 'css-loader']
      },
      {
        test: /.less$/,
        use: [{
          loader: "style-loader", // creates style nodes from JS strings
        }, {
          loader: "css-loader" // translates CSS into CommonJS
        }, {
          loader: "less-loader", // compiles Less to CSS
        }]
      },
      {
        test: /.(png|jpg|gif|jpeg)$/,
        use: [{
          loader: 'url-loader',
          options: {
            // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
            // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
            limit: 13000,
            name: 'imgs/[name].[hash:8].[ext]'
          },
        }]
      },
      {
        test: /.js$/,
        // exclude: 排除
        // include: 包含
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['es2015']
          }
        }
      },
      {
        test: /.vue$/,
        use: ['vue-loader']
      }
    ]
  },
  resolve: {
    // alias: 别名
    extensions: ['.js', '.css', '.vue'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  },
  plugins: [
    new webpack.BannerPlugin('最终版权归我所有'),
    new HtmlWebpackPlugin({
      template: 'index.html'
    })
  ] 
}
base.config.js
const webpackMerge = require('webpack-merge') //合并:base.config.js + webpack-merge
const baseConfig = require('./base.config')   //引入base.config文件

module.exports = webpackMerge(baseConfig, {
  devServer: {
    contentBase: './dist',
    inline: true
  }
})
dev.config.js
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
const webpackMerge = require('webpack-merge') //合并:base.config.js + webpack-merge
const baseConfig = require('./base.config')   //引入base.config文件

module.exports = webpackMerge(baseConfig, {
  plugins: [
    new UglifyjsWebpackPlugin()
  ]
})
prod.config.js

三、修改package.json中scripts配置

{
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-preset-es2015": "^6.24.1",
    "css-loader": "^2.0.2",
    "file-loader": "^3.0.1",
    "html-webpack-plugin": "^3.2.0",
    "less": "^3.9.0",
    "less-loader": "^4.1.0",
    "style-loader": "^0.23.1",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^1.1.2",
    "vue-loader": "^13.0.0",
    "vue-template-compiler": "^2.5.21",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.5"
  },
  "name": "meetwebpack",
  "description": "为了每个项目环境都相对孤立,我进行局部安装webpack。
 但是在进行局部安装之前,考虑到npm网速太慢,决定使用cnpm安装",
  "version": "1.0.0",
  "main": "webpack.config.js",
  "dependencies": {
    "_acorn-dynamic-import@2.0.2@acorn-dynamic-import": "^2.0.2",
    "_acorn@4.0.13@acorn": "^4.0.13",
    "_acorn@5.7.4@acorn": "^5.7.4",
    "_ajv-keywords@2.1.1@ajv-keywords": "^2.1.1",
    "_ajv@5.5.2@ajv": "^5.5.2",
    "_align-text@0.1.4@align-text": "^0.1.4",
    "_ansi-regex@2.1.1@ansi-regex": "^2.1.1",
    "_ansi-regex@3.0.0@ansi-regex": "^3.0.0",
    "_anymatch@2.0.0@anymatch": "^2.0.0",
    "_anymatch@3.1.2@anymatch": "^3.1.2",
    "_arr-diff@4.0.0@arr-diff": "^4.0.0",
    "_arr-flatten@1.1.0@arr-flatten": "^1.1.0",
    "_arr-union@3.1.0@arr-union": "^3.1.0",
    "_array-unique@0.3.2@array-unique": "^0.3.2",
    "_asn1.js@5.4.1@asn1.js": "^5.4.1",
    "_assert@1.5.0@assert": "^1.5.0",
    "_assign-symbols@1.0.0@assign-symbols": "^1.0.0",
    "_async-each@1.0.3@async-each": "^1.0.3",
    "_async@2.6.3@async": "^2.6.3",
    "_atob@2.1.2@atob": "^2.1.2",
    "_base64-js@1.5.1@base64-js": "^1.5.1",
    "_base@0.11.2@base": "^0.11.2",
    "_big.js@5.2.2@big.js": "^5.2.2",
    "_binary-extensions@1.13.1@binary-extensions": "^1.13.1",
    "_binary-extensions@2.2.0@binary-extensions": "^2.2.0",
    "_bn.js@4.12.0@bn.js": "^4.12.0",
    "_bn.js@5.2.0@bn.js": "^5.2.0",
    "_braces@2.3.2@braces": "^2.3.2",
    "_braces@3.0.2@braces": "^3.0.2",
    "_brorand@1.1.0@brorand": "^1.1.0",
    "_browserify-aes@1.2.0@browserify-aes": "^1.2.0",
    "_browserify-cipher@1.0.1@browserify-cipher": "^1.0.1",
    "_browserify-des@1.0.2@browserify-des": "^1.0.2",
    "_browserify-rsa@4.1.0@browserify-rsa": "^4.1.0",
    "_browserify-sign@4.2.1@browserify-sign": "^4.2.1",
    "_browserify-zlib@0.2.0@browserify-zlib": "^0.2.0",
    "_buffer-xor@1.0.3@buffer-xor": "^1.0.3",
    "_buffer@4.9.2@buffer": "^4.9.2",
    "_builtin-status-codes@3.0.0@builtin-status-codes": "^3.0.0",
    "_cache-base@1.0.1@cache-base": "^1.0.1",
    "_camelcase@1.2.1@camelcase": "^1.2.1",
    "_camelcase@4.1.0@camelcase": "^4.1.0",
    "_center-align@0.1.3@center-align": "^0.1.3",
    "_chokidar@2.1.8@chokidar": "^2.1.8",
    "_chokidar@3.5.1@chokidar": "^3.5.1",
    "_cipher-base@1.0.4@cipher-base": "^1.0.4",
    "_class-utils@0.3.6@class-utils": "^0.3.6",
    "_cliui@2.1.0@cliui": "^2.1.0",
    "_cliui@3.2.0@cliui": "^3.2.0",
    "_co@4.6.0@co": "^4.6.0",
    "_code-point-at@1.1.0@code-point-at": "^1.1.0",
    "_collection-visit@1.0.0@collection-visit": "^1.0.0",
    "_component-emitter@1.3.0@component-emitter": "^1.3.0",
    "_console-browserify@1.2.0@console-browserify": "^1.2.0",
    "_constants-browserify@1.0.0@constants-browserify": "^1.0.0",
    "_copy-descriptor@0.1.1@copy-descriptor": "^0.1.1",
    "_core-util-is@1.0.2@core-util-is": "^1.0.2",
    "_create-ecdh@4.0.4@create-ecdh": "^4.0.4",
    "_create-hash@1.2.0@create-hash": "^1.2.0",
    "_create-hmac@1.1.7@create-hmac": "^1.1.7",
    "_cross-spawn@5.1.0@cross-spawn": "^5.1.0",
    "_crypto-browserify@3.12.0@crypto-browserify": "^3.12.0",
    "_d@1.0.1@d": "^1.0.1",
    "_debug@2.6.9@debug": "^2.6.9",
    "_decamelize@1.2.0@decamelize": "^1.2.0",
    "_decode-uri-component@0.2.0@decode-uri-component": "^0.2.0",
    "_define-property@0.2.5@define-property": "^0.2.5",
    "_define-property@1.0.0@define-property": "^1.0.0",
    "_define-property@2.0.2@define-property": "^2.0.2",
    "_des.js@1.0.1@des.js": "^1.0.1",
    "_diffie-hellman@5.0.3@diffie-hellman": "^5.0.3",
    "_domain-browser@1.2.0@domain-browser": "^1.2.0",
    "_elliptic@6.5.4@elliptic": "^6.5.4",
    "_emojis-list@3.0.0@emojis-list": "^3.0.0",
    "_enhanced-resolve@3.4.1@enhanced-resolve": "^3.4.1",
    "_errno@0.1.8@errno": "^0.1.8",
    "_error-ex@1.3.2@error-ex": "^1.3.2",
    "_es5-ext@0.10.53@es5-ext": "^0.10.53",
    "_es6-iterator@2.0.3@es6-iterator": "^2.0.3",
    "_es6-map@0.1.5@es6-map": "^0.1.5",
    "_es6-set@0.1.5@es6-set": "^0.1.5",
    "_es6-symbol@3.1.1@es6-symbol": "^3.1.1",
    "_es6-symbol@3.1.3@es6-symbol": "^3.1.3",
    "_es6-weak-map@2.0.3@es6-weak-map": "^2.0.3",
    "_escope@3.6.0@escope": "^3.6.0",
    "_esrecurse@4.3.0@esrecurse": "^4.3.0",
    "_estraverse@4.3.0@estraverse": "^4.3.0",
    "_estraverse@5.2.0@estraverse": "^5.2.0",
    "_event-emitter@0.3.5@event-emitter": "^0.3.5",
    "_events@3.3.0@events": "^3.3.0",
    "_evp_bytestokey@1.0.3@evp_bytestokey": "^1.0.3",
    "_execa@0.7.0@execa": "^0.7.0",
    "_expand-brackets@2.1.4@expand-brackets": "^2.1.4",
    "_ext@1.4.0@ext": "^1.4.0",
    "_extend-shallow@2.0.1@extend-shallow": "^2.0.1",
    "_extend-shallow@3.0.2@extend-shallow": "^3.0.2",
    "_extglob@2.0.4@extglob": "^2.0.4",
    "_fast-deep-equal@1.1.0@fast-deep-equal": "^1.1.0",
    "_fast-json-stable-stringify@2.1.0@fast-json-stable-stringify": "^2.1.0",
    "_fill-range@4.0.0@fill-range": "^4.0.0",
    "_fill-range@7.0.1@fill-range": "^7.0.1",
    "_find-up@2.1.0@find-up": "^2.1.0",
    "_for-in@1.0.2@for-in": "^1.0.2",
    "_fragment-cache@0.2.1@fragment-cache": "^0.2.1",
    "_fsevents@1.2.13@fsevents": "^1.2.13",
    "_fsevents@2.3.2@fsevents": "^2.3.2",
    "_function-bind@1.1.1@function-bind": "^1.1.1",
    "_get-caller-file@1.0.3@get-caller-file": "^1.0.3",
    "_get-stream@3.0.0@get-stream": "^3.0.0",
    "_get-value@2.0.6@get-value": "^2.0.6",
    "_glob-parent@3.1.0@glob-parent": "^3.1.0",
    "_glob-parent@5.1.2@glob-parent": "^5.1.2",
    "_graceful-fs@4.2.6@graceful-fs": "^4.2.6",
    "_has-flag@2.0.0@has-flag": "^2.0.0",
    "_has-value@0.3.1@has-value": "^0.3.1",
    "_has-value@1.0.0@has-value": "^1.0.0",
    "_has-values@0.1.4@has-values": "^0.1.4",
    "_has-values@1.0.0@has-values": "^1.0.0",
    "_has@1.0.3@has": "^1.0.3",
    "_hash-base@3.1.0@hash-base": "^3.1.0",
    "_hash.js@1.1.7@hash.js": "^1.1.7",
    "_hmac-drbg@1.0.1@hmac-drbg": "^1.0.1",
    "_hosted-git-info@2.8.9@hosted-git-info": "^2.8.9",
    "_https-browserify@1.0.0@https-browserify": "^1.0.0",
    "_ieee754@1.2.1@ieee754": "^1.2.1",
    "_inherits@2.0.1@inherits": "^2.0.1",
    "_inherits@2.0.3@inherits": "^2.0.3",
    "_inherits@2.0.4@inherits": "^2.0.4",
    "_interpret@1.4.0@interpret": "^1.4.0",
    "_invert-kv@1.0.0@invert-kv": "^1.0.0",
    "_is-accessor-descriptor@0.1.6@is-accessor-descriptor": "^0.1.6",
    "_is-accessor-descriptor@1.0.0@is-accessor-descriptor": "^1.0.0",
    "_is-arrayish@0.2.1@is-arrayish": "^0.2.1",
    "_is-binary-path@1.0.1@is-binary-path": "^1.0.1",
    "_is-binary-path@2.1.0@is-binary-path": "^2.1.0",
    "_is-buffer@1.1.6@is-buffer": "^1.1.6",
    "_is-core-module@2.4.0@is-core-module": "^2.4.0",
    "_is-data-descriptor@0.1.4@is-data-descriptor": "^0.1.4",
    "_is-data-descriptor@1.0.0@is-data-descriptor": "^1.0.0",
    "_is-descriptor@0.1.6@is-descriptor": "^0.1.6",
    "_is-descriptor@1.0.2@is-descriptor": "^1.0.2",
    "_is-extendable@0.1.1@is-extendable": "^0.1.1",
    "_is-extendable@1.0.1@is-extendable": "^1.0.1",
    "_is-extglob@2.1.1@is-extglob": "^2.1.1",
    "_is-fullwidth-code-point@1.0.0@is-fullwidth-code-point": "^1.0.0",
    "_is-fullwidth-code-point@2.0.0@is-fullwidth-code-point": "^2.0.0",
    "_is-glob@3.1.0@is-glob": "^3.1.0",
    "_is-glob@4.0.1@is-glob": "^4.0.1",
    "_is-number@3.0.0@is-number": "^3.0.0",
    "_is-number@7.0.0@is-number": "^7.0.0",
    "_is-plain-object@2.0.4@is-plain-object": "^2.0.4",
    "_is-stream@1.1.0@is-stream": "^1.1.0",
    "_is-windows@1.0.2@is-windows": "^1.0.2",
    "_isarray@1.0.0@isarray": "^1.0.0",
    "_isexe@2.0.0@isexe": "^2.0.0",
    "_isobject@2.1.0@isobject": "^2.1.0",
    "_isobject@3.0.1@isobject": "^3.0.1",
    "_json-loader@0.5.7@json-loader": "^0.5.7",
    "_json-schema-traverse@0.3.1@json-schema-traverse": "^0.3.1",
    "_json5@0.5.1@json5": "^0.5.1",
    "_json5@1.0.1@json5": "^1.0.1",
    "_kind-of@3.2.2@kind-of": "^3.2.2",
    "_kind-of@4.0.0@kind-of": "^4.0.0",
    "_kind-of@5.1.0@kind-of": "^5.1.0",
    "_kind-of@6.0.3@kind-of": "^6.0.3",
    "_lazy-cache@1.0.4@lazy-cache": "^1.0.4",
    "_lcid@1.0.0@lcid": "^1.0.0",
    "_load-json-file@2.0.0@load-json-file": "^2.0.0",
    "_loader-runner@2.4.0@loader-runner": "^2.4.0",
    "_loader-utils@1.4.0@loader-utils": "^1.4.0",
    "_locate-path@2.0.0@locate-path": "^2.0.0",
    "_lodash@4.17.21@lodash": "^4.17.21",
    "_longest@1.0.1@longest": "^1.0.1",
    "_lru-cache@4.1.5@lru-cache": "^4.1.5",
    "_map-cache@0.2.2@map-cache": "^0.2.2",
    "_map-visit@1.0.0@map-visit": "^1.0.0",
    "_md5.js@1.3.5@md5.js": "^1.3.5",
    "_mem@1.1.0@mem": "^1.1.0",
    "_memory-fs@0.4.1@memory-fs": "^0.4.1",
    "_micromatch@3.1.10@micromatch": "^3.1.10",
    "_miller-rabin@4.0.1@miller-rabin": "^4.0.1",
    "_mimic-fn@1.2.0@mimic-fn": "^1.2.0",
    "_minimalistic-assert@1.0.1@minimalistic-assert": "^1.0.1",
    "_minimalistic-crypto-utils@1.0.1@minimalistic-crypto-utils": "^1.0.1",
    "_minimist@1.2.5@minimist": "^1.2.5",
    "_mixin-deep@1.3.2@mixin-deep": "^1.3.2",
    "_mkdirp@0.5.5@mkdirp": "^0.5.5",
    "_ms@2.0.0@ms": "^2.0.0",
    "_nanomatch@1.2.13@nanomatch": "^1.2.13",
    "_neo-async@2.6.2@neo-async": "^2.6.2",
    "_next-tick@1.0.0@next-tick": "^1.0.0",
    "_node-libs-browser@2.2.1@node-libs-browser": "^2.2.1",
    "_normalize-package-data@2.5.0@normalize-package-data": "^2.5.0",
    "_normalize-path@2.1.1@normalize-path": "^2.1.1",
    "_normalize-path@3.0.0@normalize-path": "^3.0.0",
    "_npm-run-path@2.0.2@npm-run-path": "^2.0.2",
    "_number-is-nan@1.0.1@number-is-nan": "^1.0.1",
    "_object-assign@4.1.1@object-assign": "^4.1.1",
    "_object-copy@0.1.0@object-copy": "^0.1.0",
    "_object-visit@1.0.1@object-visit": "^1.0.1",
    "_object.pick@1.3.0@object.pick": "^1.3.0",
    "_os-browserify@0.3.0@os-browserify": "^0.3.0",
    "_os-locale@2.1.0@os-locale": "^2.1.0",
    "_p-finally@1.0.0@p-finally": "^1.0.0",
    "_p-limit@1.3.0@p-limit": "^1.3.0",
    "_p-locate@2.0.0@p-locate": "^2.0.0",
    "_p-try@1.0.0@p-try": "^1.0.0",
    "_pako@1.0.11@pako": "^1.0.11",
    "_parse-asn1@5.1.6@parse-asn1": "^5.1.6",
    "_parse-json@2.2.0@parse-json": "^2.2.0",
    "_pascalcase@0.1.1@pascalcase": "^0.1.1",
    "_path-browserify@0.0.1@path-browserify": "^0.0.1",
    "_path-dirname@1.0.2@path-dirname": "^1.0.2",
    "_path-exists@3.0.0@path-exists": "^3.0.0",
    "_path-is-absolute@1.0.1@path-is-absolute": "^1.0.1",
    "_path-key@2.0.1@path-key": "^2.0.1",
    "_path-parse@1.0.7@path-parse": "^1.0.7",
    "_path-type@2.0.0@path-type": "^2.0.0",
    "_pbkdf2@3.1.2@pbkdf2": "^3.1.2",
    "_picomatch@2.3.0@picomatch": "^2.3.0",
    "_pify@2.3.0@pify": "^2.3.0",
    "_posix-character-classes@0.1.1@posix-character-classes": "^0.1.1",
    "_process-nextick-args@2.0.1@process-nextick-args": "^2.0.1",
    "_process@0.11.10@process": "^0.11.10",
    "_prr@1.0.1@prr": "^1.0.1",
    "_pseudomap@1.0.2@pseudomap": "^1.0.2",
    "_public-encrypt@4.0.3@public-encrypt": "^4.0.3",
    "_punycode@1.3.2@punycode": "^1.3.2",
    "_punycode@1.4.1@punycode": "^1.4.1",
    "_querystring-es3@0.2.1@querystring-es3": "^0.2.1",
    "_querystring@0.2.0@querystring": "^0.2.0",
    "_randombytes@2.1.0@randombytes": "^2.1.0",
    "_randomfill@1.0.4@randomfill": "^1.0.4",
    "_read-pkg-up@2.0.0@read-pkg-up": "^2.0.0",
    "_read-pkg@2.0.0@read-pkg": "^2.0.0",
    "_readable-stream@2.3.7@readable-stream": "^2.3.7",
    "_readable-stream@3.6.0@readable-stream": "^3.6.0",
    "_readdirp@2.2.1@readdirp": "^2.2.1",
    "_readdirp@3.5.0@readdirp": "^3.5.0",
    "_regex-not@1.0.2@regex-not": "^1.0.2",
    "_remove-trailing-separator@1.1.0@remove-trailing-separator": "^1.1.0",
    "_repeat-element@1.1.4@repeat-element": "^1.1.4",
    "_repeat-string@1.6.1@repeat-string": "^1.6.1",
    "_require-directory@2.1.1@require-directory": "^2.1.1",
    "_require-main-filename@1.0.1@require-main-filename": "^1.0.1",
    "_resolve-url@0.2.1@resolve-url": "^0.2.1",
    "_resolve@1.20.0@resolve": "^1.20.0",
    "_ret@0.1.15@ret": "^0.1.15",
    "_right-align@0.1.3@right-align": "^0.1.3",
    "_ripemd160@2.0.2@ripemd160": "^2.0.2",
    "_safe-buffer@5.1.2@safe-buffer": "^5.1.2",
    "_safe-buffer@5.2.1@safe-buffer": "^5.2.1",
    "_safe-regex@1.1.0@safe-regex": "^1.1.0",
    "_safer-buffer@2.1.2@safer-buffer": "^2.1.2",
    "_semver@5.7.1@semver": "^5.7.1",
    "_set-blocking@2.0.0@set-blocking": "^2.0.0",
    "_set-value@2.0.1@set-value": "^2.0.1",
    "_setimmediate@1.0.5@setimmediate": "^1.0.5",
    "_sha.js@2.4.11@sha.js": "^2.4.11",
    "_shebang-command@1.2.0@shebang-command": "^1.2.0",
    "_shebang-regex@1.0.0@shebang-regex": "^1.0.0",
    "_signal-exit@3.0.3@signal-exit": "^3.0.3",
    "_snapdragon-node@2.1.1@snapdragon-node": "^2.1.1",
    "_snapdragon-util@3.0.1@snapdragon-util": "^3.0.1",
    "_snapdragon@0.8.2@snapdragon": "^0.8.2",
    "_source-list-map@2.0.1@source-list-map": "^2.0.1",
    "_source-map-resolve@0.5.3@source-map-resolve": "^0.5.3",
    "_source-map-url@0.4.1@source-map-url": "^0.4.1",
    "_source-map@0.5.7@source-map": "^0.5.7",
    "_source-map@0.6.1@source-map": "^0.6.1",
    "_spdx-correct@3.1.1@spdx-correct": "^3.1.1",
    "_spdx-exceptions@2.3.0@spdx-exceptions": "^2.3.0",
    "_spdx-expression-parse@3.0.1@spdx-expression-parse": "^3.0.1",
    "_spdx-license-ids@3.0.9@spdx-license-ids": "^3.0.9",
    "_split-string@3.1.0@split-string": "^3.1.0",
    "_static-extend@0.1.2@static-extend": "^0.1.2",
    "_stream-browserify@2.0.2@stream-browserify": "^2.0.2",
    "_stream-http@2.8.3@stream-http": "^2.8.3",
    "_string-width@1.0.2@string-width": "^1.0.2",
    "_string-width@2.1.1@string-width": "^2.1.1",
    "_string_decoder@1.1.1@string_decoder": "^1.1.1",
    "_string_decoder@1.3.0@string_decoder": "^1.3.0",
    "_strip-ansi@3.0.1@strip-ansi": "^3.0.1",
    "_strip-ansi@4.0.0@strip-ansi": "^4.0.0",
    "_strip-bom@3.0.0@strip-bom": "^3.0.0",
    "_strip-eof@1.0.0@strip-eof": "^1.0.0",
    "_supports-color@4.5.0@supports-color": "^4.5.0",
    "_tapable@0.2.9@tapable": "^0.2.9",
    "_timers-browserify@2.0.12@timers-browserify": "^2.0.12",
    "_to-arraybuffer@1.0.1@to-arraybuffer": "^1.0.1",
    "_to-object-path@0.3.0@to-object-path": "^0.3.0",
    "_to-regex-range@2.1.1@to-regex-range": "^2.1.1",
    "_to-regex-range@5.0.1@to-regex-range": "^5.0.1",
    "_to-regex@3.0.2@to-regex": "^3.0.2",
    "_tty-browserify@0.0.0@tty-browserify": "^0.0.0",
    "_type@1.2.0@type": "^1.2.0",
    "_type@2.5.0@type": "^2.5.0",
    "_uglify-js@2.8.29@uglify-js": "^2.8.29",
    "_uglify-to-browserify@1.0.2@uglify-to-browserify": "^1.0.2",
    "_uglifyjs-webpack-plugin@0.4.6@uglifyjs-webpack-plugin": "^0.4.6",
    "_union-value@1.0.1@union-value": "^1.0.1",
    "_unset-value@1.0.0@unset-value": "^1.0.0",
    "_upath@1.2.0@upath": "^1.2.0",
    "_urix@0.1.0@urix": "^0.1.0",
    "_url@0.11.0@url": "^0.11.0",
    "_use@3.1.1@use": "^3.1.1",
    "_util-deprecate@1.0.2@util-deprecate": "^1.0.2",
    "_util@0.10.3@util": "^0.10.3",
    "_util@0.11.1@util": "^0.11.1",
    "_validate-npm-package-license@3.0.4@validate-npm-package-license": "^3.0.4",
    "_vm-browserify@1.1.2@vm-browserify": "^1.1.2",
    "_watchpack-chokidar2@2.0.1@watchpack-chokidar2": "^2.0.1",
    "_watchpack@1.7.5@watchpack": "^1.7.5",
    "_webpack-sources@1.4.3@webpack-sources": "^1.4.3",
    "_webpack@3.6.0@webpack": "^3.6.0",
    "_which-module@2.0.0@which-module": "^2.0.0",
    "_which@1.3.1@which": "^1.3.1",
    "_window-size@0.1.0@window-size": "^0.1.0",
    "_wordwrap@0.0.2@wordwrap": "^0.0.2",
    "_wrap-ansi@2.1.0@wrap-ansi": "^2.1.0",
    "_xtend@4.0.2@xtend": "^4.0.2",
    "_y18n@3.2.2@y18n": "^3.2.2",
    "_yallist@2.1.2@yallist": "^2.1.2",
    "_yargs-parser@7.0.0@yargs-parser": "^7.0.0",
    "_yargs@3.10.0@yargs": "^3.10.0",
    "_yargs@8.0.2@yargs": "^8.0.2",
    "acorn": "^5.7.4",
    "acorn-dynamic-import": "^2.0.2",
    "ajv": "^5.5.2",
    "ajv-keywords": "^2.1.1",
    "align-text": "^0.1.4",
    "ansi-regex": "^3.0.0",
    "anymatch": "^3.1.2",
    "arr-diff": "^4.0.0",
    "arr-flatten": "^1.1.0",
    "arr-union": "^3.1.0",
    "array-unique": "^0.3.2",
    "asn1.js": "^5.4.1",
    "assert": "^1.5.0",
    "assign-symbols": "^1.0.0",
    "async": "^2.6.3",
    "async-each": "^1.0.3",
    "atob": "^2.1.2",
    "base": "^0.11.2",
    "base64-js": "^1.5.1",
    "big.js": "^5.2.2",
    "binary-extensions": "^2.2.0",
    "bn.js": "^5.2.0",
    "braces": "^3.0.2",
    "brorand": "^1.1.0",
    "browserify-aes": "^1.2.0",
    "browserify-cipher": "^1.0.1",
    "browserify-des": "^1.0.2",
    "browserify-rsa": "^4.1.0",
    "browserify-sign": "^4.2.1",
    "browserify-zlib": "^0.2.0",
    "buffer": "^4.9.2",
    "buffer-xor": "^1.0.3",
    "builtin-status-codes": "^3.0.0",
    "cache-base": "^1.0.1",
    "camelcase": "^4.1.0",
    "center-align": "^0.1.3",
    "chokidar": "^3.5.1",
    "cipher-base": "^1.0.4",
    "class-utils": "^0.3.6",
    "cliui": "^3.2.0",
    "co": "^4.6.0",
    "code-point-at": "^1.1.0",
    "collection-visit": "^1.0.0",
    "component-emitter": "^1.3.0",
    "console-browserify": "^1.2.0",
    "constants-browserify": "^1.0.0",
    "copy-descriptor": "^0.1.1",
    "core-util-is": "^1.0.2",
    "create-ecdh": "^4.0.4",
    "create-hash": "^1.2.0",
    "create-hmac": "^1.1.7",
    "cross-spawn": "^5.1.0",
    "crypto-browserify": "^3.12.0",
    "d": "^1.0.1",
    "debug": "^2.6.9",
    "decamelize": "^1.2.0",
    "decode-uri-component": "^0.2.0",
    "define-property": "^2.0.2",
    "des.js": "^1.0.1",
    "diffie-hellman": "^5.0.3",
    "domain-browser": "^1.2.0",
    "elliptic": "^6.5.4",
    "emojis-list": "^3.0.0",
    "enhanced-resolve": "^3.4.1",
    "errno": "^0.1.8",
    "error-ex": "^1.3.2",
    "es5-ext": "^0.10.53",
    "es6-iterator": "^2.0.3",
    "es6-map": "^0.1.5",
    "es6-set": "^0.1.5",
    "es6-symbol": "^3.1.3",
    "es6-weak-map": "^2.0.3",
    "escope": "^3.6.0",
    "esrecurse": "^4.3.0",
    "estraverse": "^5.2.0",
    "event-emitter": "^0.3.5",
    "events": "^3.3.0",
    "evp_bytestokey": "^1.0.3",
    "execa": "^0.7.0",
    "expand-brackets": "^2.1.4",
    "ext": "^1.4.0",
    "extend-shallow": "^3.0.2",
    "extglob": "^2.0.4",
    "fast-deep-equal": "^1.1.0",
    "fast-json-stable-stringify": "^2.1.0",
    "fill-range": "^7.0.1",
    "find-up": "^2.1.0",
    "for-in": "^1.0.2",
    "fragment-cache": "^0.2.1",
    "fsevents": "^2.3.2",
    "function-bind": "^1.1.1",
    "get-caller-file": "^1.0.3",
    "get-stream": "^3.0.0",
    "get-value": "^2.0.6",
    "glob-parent": "^5.1.2",
    "graceful-fs": "^4.2.6",
    "has": "^1.0.3",
    "has-flag": "^2.0.0",
    "has-value": "^1.0.0",
    "has-values": "^1.0.0",
    "hash-base": "^3.1.0",
    "hash.js": "^1.1.7",
    "hmac-drbg": "^1.0.1",
    "hosted-git-info": "^2.8.9",
    "https-browserify": "^1.0.0",
    "ieee754": "^1.2.1",
    "inherits": "^2.0.4",
    "interpret": "^1.4.0",
    "invert-kv": "^1.0.0",
    "is-accessor-descriptor": "^1.0.0",
    "is-arrayish": "^0.2.1",
    "is-binary-path": "^2.1.0",
    "is-buffer": "^1.1.6",
    "is-core-module": "^2.4.0",
    "is-data-descriptor": "^1.0.0",
    "is-descriptor": "^1.0.2",
    "is-extendable": "^1.0.1",
    "is-extglob": "^2.1.1",
    "is-fullwidth-code-point": "^2.0.0",
    "is-glob": "^4.0.1",
    "is-number": "^7.0.0",
    "is-plain-object": "^2.0.4",
    "is-stream": "^1.1.0",
    "is-windows": "^1.0.2",
    "isarray": "^1.0.0",
    "isexe": "^2.0.0",
    "isobject": "^3.0.1",
    "json-loader": "^0.5.7",
    "json-schema-traverse": "^0.3.1",
    "json5": "^1.0.1",
    "kind-of": "^6.0.3",
    "lazy-cache": "^1.0.4",
    "lcid": "^1.0.0",
    "load-json-file": "^2.0.0",
    "loader-runner": "^2.4.0",
    "loader-utils": "^1.4.0",
    "locate-path": "^2.0.0",
    "lodash": "^4.17.21",
    "longest": "^1.0.1",
    "lru-cache": "^4.1.5",
    "map-cache": "^0.2.2",
    "map-visit": "^1.0.0",
    "md5.js": "^1.3.5",
    "mem": "^1.1.0",
    "memory-fs": "^0.4.1",
    "micromatch": "^3.1.10",
    "miller-rabin": "^4.0.1",
    "mimic-fn": "^1.2.0",
    "minimalistic-assert": "^1.0.1",
    "minimalistic-crypto-utils": "^1.0.1",
    "minimist": "^1.2.5",
    "mixin-deep": "^1.3.2",
    "mkdirp": "^0.5.5",
    "ms": "^2.0.0",
    "nanomatch": "^1.2.13",
    "neo-async": "^2.6.2",
    "next-tick": "^1.0.0",
    "node-libs-browser": "^2.2.1",
    "normalize-package-data": "^2.5.0",
    "normalize-path": "^3.0.0",
    "npm-run-path": "^2.0.2",
    "number-is-nan": "^1.0.1",
    "object-assign": "^4.1.1",
    "object-copy": "^0.1.0",
    "object-visit": "^1.0.1",
    "object.pick": "^1.3.0",
    "os-browserify": "^0.3.0",
    "os-locale": "^2.1.0",
    "p-finally": "^1.0.0",
    "p-limit": "^1.3.0",
    "p-locate": "^2.0.0",
    "p-try": "^1.0.0",
    "pako": "^1.0.11",
    "parse-asn1": "^5.1.6",
    "parse-json": "^2.2.0",
    "pascalcase": "^0.1.1",
    "path-browserify": "^0.0.1",
    "path-dirname": "^1.0.2",
    "path-exists": "^3.0.0",
    "path-is-absolute": "^1.0.1",
    "path-key": "^2.0.1",
    "path-parse": "^1.0.7",
    "path-type": "^2.0.0",
    "pbkdf2": "^3.1.2",
    "picomatch": "^2.3.0",
    "pify": "^2.3.0",
    "posix-character-classes": "^0.1.1",
    "process": "^0.11.10",
    "process-nextick-args": "^2.0.1",
    "prr": "^1.0.1",
    "pseudomap": "^1.0.2",
    "public-encrypt": "^4.0.3",
    "punycode": "^1.4.1",
    "querystring": "^0.2.0",
    "querystring-es3": "^0.2.1",
    "randombytes": "^2.1.0",
    "randomfill": "^1.0.4",
    "read-pkg": "^2.0.0",
    "read-pkg-up": "^2.0.0",
    "readable-stream": "^3.6.0",
    "readdirp": "^3.5.0",
    "regex-not": "^1.0.2",
    "remove-trailing-separator": "^1.1.0",
    "repeat-element": "^1.1.4",
    "repeat-string": "^1.6.1",
    "require-directory": "^2.1.1",
    "require-main-filename": "^1.0.1",
    "resolve": "^1.20.0",
    "resolve-url": "^0.2.1",
    "ret": "^0.1.15",
    "right-align": "^0.1.3",
    "ripemd160": "^2.0.2",
    "safe-buffer": "^5.2.1",
    "safe-regex": "^1.1.0",
    "safer-buffer": "^2.1.2",
    "semver": "^5.7.1",
    "set-blocking": "^2.0.0",
    "set-value": "^2.0.1",
    "setimmediate": "^1.0.5",
    "sha.js": "^2.4.11",
    "shebang-command": "^1.2.0",
    "shebang-regex": "^1.0.0",
    "signal-exit": "^3.0.3",
    "snapdragon": "^0.8.2",
    "snapdragon-node": "^2.1.1",
    "snapdragon-util": "^3.0.1",
    "source-list-map": "^2.0.1",
    "source-map": "^0.6.1",
    "source-map-resolve": "^0.5.3",
    "source-map-url": "^0.4.1",
    "spdx-correct": "^3.1.1",
    "spdx-exceptions": "^2.3.0",
    "spdx-expression-parse": "^3.0.1",
    "spdx-license-ids": "^3.0.9",
    "split-string": "^3.1.0",
    "static-extend": "^0.1.2",
    "stream-browserify": "^2.0.2",
    "stream-http": "^2.8.3",
    "string-width": "^2.1.1",
    "string_decoder": "^1.3.0",
    "strip-ansi": "^4.0.0",
    "strip-bom": "^3.0.0",
    "strip-eof": "^1.0.0",
    "supports-color": "^4.5.0",
    "tapable": "^0.2.9",
    "timers-browserify": "^2.0.12",
    "to-arraybuffer": "^1.0.1",
    "to-object-path": "^0.3.0",
    "to-regex": "^3.0.2",
    "to-regex-range": "^5.0.1",
    "tty-browserify": "^0.0.0",
    "type": "^2.5.0",
    "uglify-js": "^2.8.29",
    "uglify-to-browserify": "^1.0.2",
    "uglifyjs-webpack-plugin": "^0.4.6",
    "union-value": "^1.0.1",
    "unset-value": "^1.0.0",
    "upath": "^1.2.0",
    "urix": "^0.1.0",
    "url": "^0.11.0",
    "use": "^3.1.1",
    "util": "^0.11.1",
    "util-deprecate": "^1.0.2",
    "validate-npm-package-license": "^3.0.4",
    "vm-browserify": "^1.1.2",
    "vue": "^2.6.14",
    "watchpack": "^1.7.5",
    "watchpack-chokidar2": "^2.0.1",
    "webpack-sources": "^1.4.3",
    "which": "^1.3.1",
    "which-module": "^2.0.0",
    "window-size": "^0.1.0",
    "wordwrap": "^0.0.2",
    "wrap-ansi": "^2.1.0",
    "xtend": "^4.0.2",
    "y18n": "^3.2.2",
    "yallist": "^2.1.2",
    "yargs": "^8.0.2",
    "yargs-parser": "^7.0.0"
  },
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack --config ./build/prod.config.js",
    "dev": "webpack-dev-server --open --config ./build/dev.config.js"
  },
  "author": "",
  "license": "ISC"
}
package.json

四、展示

生产环境 npm run build

 开发环境 npm run dev

 下一篇:饮冰三年-人工智能-Vue-68 CLI相关

原文地址:https://www.cnblogs.com/YK2012/p/14882442.html