46.手把手教VUE的Webpack使用

本章节代码在码云以压缩包形式上传:

https://gitee.com/cxy-xupeng/vue-webpack.git

目录

本章节代码在码云以压缩包形式上传

一、模块化

1、为什么需要模块化

2、常见的模块化规范*

3、ES的导入导出

二、什么是Webpack

三、Webpack安装

四、Webpack初体验

五、Webpack配置

六、css模块化配置

七、less文件的处理

八、引入图片

九、ES6转ES5的babel

十、在webpack中整合Vue

十一、vue的终极解决方案(重要)

十二、plugin

1.添加版权的plugin

2.打包html的plugin

3.压缩js的plugin

4.热部署

5.配置文件的分离


一、模块化

1、为什么需要模块化

以前的前端代码有两个问题:

(1).全局变量会被不同的地方赋值。比如我创建一个全局flag,值为true,我要用的时候发现为false,原来公司同事把我这个在他那边变了false,就很困扰。针对全局变量被不同赋值,我们通过匿名内部类

(2)虽然上面问题解决了,又有新问题:我匿名内部类的代码我想复用又不行了。解决方案:运用面向对象思想进行模块化开发

2、常见的模块化规范*

既然要用模块化了,肯定要遵循规范,常见规范:

  • CommonJS
  • AMD
  • CMD
  • ES6的Modules

3、ES的导入导出

1.type="module"

2.export:导出

var name = '徐鹏'
var age = 18
var flag = true

function sum(a,b){
	return a+b;
}

if(flag){
	console.log(sum(100,200))
}

/* 1.导出方式一 */
export {
	flag,sum
}

/* 2.导出方式二 */
export var num1 = 1000
export var num2 = 1.88

/* 3.导出函数/类 */
export function mul(num1,num2){
	return num1 * num2
}
export class Person{
	run(){
		console.log('跑路')
	}
}

/* 4.导出default,每个js只能有一个default,引用的时候,可以随便命名 */
const address = '上海'
export default address

/* 5.统一全部导出 */

3.import:导入

import {flag,sum} from './aa.js'
import {num1,num2} from './aa.js'
import {mul,Person} from './aa.js'
import xupeng from './aa.js'
import * as aa from './aa.js'


if(flag){
	console.log('徐鹏哈哈')
	console.log(sum(20,20))
}

console.log(num1,num2)

console.log(mul(20,30))

const p = new Person()
p.run()

console.log(xupeng)

console.log(aa.flag)

4.commonJS导入导出

function add(num1,num2){
	return num1+num2
}

function mul(num1,num2){
	return num1*num2
}

module.exports = {
	add,
	mul
}
const {add,mul} = require('./mathUtil.js')

console.log(add(20,30))
console.log(mul(20,30))

二、什么是Webpack

Webpack:现代的js应用的静态模块打包工具。(还是不懂,记得重点:模块+打包)

我们之所以上面模块化用es是因为其他的浏览器不支持,需要解析。而Webpack就可以帮我们解析那些模块化的东西,并且能处理依赖关系。并且,我们除了js,CSS、图片等都可以当成模块。

我们的代码想要让客户用,需要通过Webpack将我们的代码模块化成浏览器支持的格式。

Webpack想要正常工作,需要依赖于node环境

而node环境肯定是需要依赖很多的包的。手动管理很多包很麻烦,我们需要一个npm工具,所以简单说,npm其实就是一个包管理工具

三、Webpack安装

1.我们先装node,这个自己去下载,安装完后查看一下版本:

2.安装npm(包管理工具),这里我们指定版本3.6.0

(如果下面代码有问题,你可以下一个5.9.0)

npm config set registry https://registry.npm.taobao.org 
npm install [email protected] -g

查看版本: 

webpack -v

四、Webpack初体验

先来看下目录:(dist下面的不要手动创建)

info.js

export const name = '徐鹏'
export const age = 18

mathUtil.js

function add(num1,num2){
	return num1+num2
}

function mul(num1,num2){
	return num1*num2
}

module.exports = {
	add,
	mul
}

main.js

/* 1.使用commonJS规范导入导出 */
const {add,mul} = require('./mathUtil.js')

console.log(add(20,30))
console.log(mul(20,30))

/* 2.使用ES6的规范导入导出 */
import {name,age} from './info.js'
console.log(name)
console.log(age)

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script src="dist/bundle.js/main.js"></script>
	</body>
</html>

进入cmd:(如果下面不行,就把-o去掉)

webpack ./src/main.js -o ./dist/bundle.js

五、Webpack配置

你如果上面的搞好了,会有一个发现,每次打包的时候需要自己制定js,还需要制定打包的js,感觉就很麻烦,咱可不可以省点事,简化发布呢?

1.首先新建一个项目

webpack.config.js:其余几个js的代码同上

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js'
	}
}

2.npm install

先进入你的文件夹,然后输入:

npm install

输入完之后,它会让你写一些信息,不用管,一路回车 。回车结束后,你会多一个package.json

3.npm install

npm install

如果你的项目有依赖的话,它会自动安装依赖。当然我们项目目前没有,所以显示这个样子 

4.webpack

webpack

5.结果

6.再做一层映射

打开package.json,输入如下:

"xupeng":"webpack"(记得前面加个逗号)

7.运行

我们不用运行webpack也可以打包了,也是能运行的

8.设置本地webpack

npm install [email protected] --save-dev

我们在终端里所有的webpack都是全局的。但是如果我们通过第六步映射后,就可以先调用本地的打包。 

安装完本地webpack后,这两个地方会发生变化

六、css模块化配置

我们先把上述代码复制一下,其中做了一些小变动:

  • 吧两个js放到js文件夹下,main.js不变。
  • 我们之前是在cmd下面输入命令,现在变成在终端下面。HBuild终端,点击左下角那个图标

1.先新建css文件

normal.css

body{
	background-color: red;
}

2.在main.js里面引入css文件

/* 1.使用commonJS规范导入导出 */
const {add,mul} = require('./js/mathUtil.js')

console.log(add(20,30))
console.log(mul(20,30))

/* 2.使用ES6的规范导入导出 */
import {name,age} from './js/info.js'
console.log(name)
console.log(age)

/* 3.依赖css文件 */
require('./css/normal.css')

3.webpack.config.js中做配置

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				style-loader:负责将样式添加到DOM
				使用多个loader,从右向左读*/
	        use: [ 'style-loader','css-loader' ]
	      }
	    ]
	  }
}

4.引入loader

看一下css-loader和style-loader的版本。大家可以自己设定

css-loader版本:

npm install --save-dev [email protected]

我最开始调用的是5.0.1版本的css-loader,后来因为版本不对运行不起来,后面改成了2.0.2(当然大家自己的版本可以自己定义,我推荐是这两个版本)

style-loader版本:

npm install style-loader --save-dev

我这边 style-loader没有自定义版本号,用的默认的2.0.0

5.运行

运行每个人都不一样,取决于你package.json里面的设定。我这边给大家看一下我的设定:(其实我的命令就相当于运行了webpack)

七、less文件的处理

说实话,作为java程序员,我也是第一次知道less文件。咱来看看特殊的css文件怎么处理

文档:https://www.webpackjs.com/concepts/

1.先看目录

2.special.less

@fontSize:50px;
@fontColor:orange;

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

3.main.js引入依赖

/* 1.使用commonJS规范导入导出 */
const {add,mul} = require('./js/mathUtil.js')

console.log(add(20,30))
console.log(mul(20,30))

/* 2.使用ES6的规范导入导出 */
import {name,age} from './js/info.js'
console.log(name)
console.log(age)

/* 3.依赖css文件 */
require('./css/normal.css')

/* 4.依赖less文件 */
require('./css/special.less')
document.writeln('徐鹏less')

4.webpack.config.js加载器

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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
		              }]
		          }
	    ]
	  }
}

5.终端引入loader(注意版本号)

npm install --save-dev [email protected] [email protected]

6.结果

八、引入图片

1.先看目录,添加两张图片到img文件夹下

2.normal.css

body{
/* 	background-color: red; */
	background: url(../img/1.jpg);
}

3.webpack.config.js新增file-loader

url-loader会和file-loader发生冲突,所以我们这边注释掉url-loader

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 40000000
				   }
				 }
			   ]
			}, */
			{
		        test: /\.(png|jpg|gif)$/,
		        use: [
		          {
		            loader: 'file-loader',
		            options: {}
		          }
		        ]
		      }
	    ]
	  }
}

4.引入依赖file-loader(注意版本)

file-loader:

npm install --save-dev [email protected]

5.查看结果

九、ES6转ES5的babel

为了向下兼容,我们需要吧ES6转成ES5

npm 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/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			}
	    ]
	  }
}

运行结果:

const都变成var了

十、在webpack中整合Vue

1.整合vue

(1)我们先把上面项目复制一份:

(2)安装vue

npm install vue --save

(3)main.js

/* 1.使用commonJS规范导入导出 */
const {add,mul} = require('./js/mathUtil.js')

console.log(add(20,30))
console.log(mul(20,30))

/* 2.使用ES6的规范导入导出 */
import {name,age} from './js/info.js'
console.log(name)
console.log(age)

/* 3.依赖css文件 */
require('./css/normal.css')

/* 4.依赖less文件 */
require('./css/special.less')
document.writeln('徐鹏less')

/* 5.使用VUE进行开发 */
import Vue from 'vue'

const app = new Vue({
	el:'#app',
	data:{
		message:'你好,徐鹏'
	}
})

(4)index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<div id="app">
			<h2>{
   
   {message}}</h2>
		</div>
		<script src="dist/bundle.js/main.js"></script>
	</body>
</html>

(5)运行

这个时候会报错,如下:

runtime-only:代码中不可以有任何的template

runtime-compiler:代码中可以有template,因为有compiler可以用于编译template

(6)加resolve

在webpack.config.js中加resolve:

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			}
	    ]
	  },
	  resolve:{
		  alias:{
			  'vue$':'vue/dist/vue.esm.js'
		  }
	  }
}

(7)重新发布

成功

2.webpack创建vue时template和el关系

我们webpack合并了vue之后,肯定要改index.html,但是我不想在这里改,怎么办?

我们template里的东西会自动放到index.html里的<div id="app">里面:

十一、vue的终极解决方案(重要)

目录:

1.下载vue(注意版本号)

npm install [email protected]

2.index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<div id="app">
		</div>
		<script src="dist/bundle.js/main.js"></script>
	</body>
</html>

3.App.vue

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

<script>
	import Xupeng from './Xupeng.vue'
	
	export default {
		name:'App',
		data(){
			return{
				message:'你好,徐鹏'
			}
		},
		methods:{
			btnClick(){
				
			}
		},
		components:{
			Xupeng
		}
	}
</script>

<style>
	.title{
		color: #0000ED;
	}
</style>

4.Xupeng.vue

<template>
	<div>
		<h2>徐鹏组件标题</h2>
		{
   
   {name}}
	</div>
</template>

<script>
	export default{
		name:'Xupeng',
		data(){
			return{
				name:'徐鹏组件的name'
			}
		}
	}
</script>

<style>
</style>

5.webpack.config.js

const path = require('path')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	 module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			},
			{
				test:/\.vue$/,
				use:['vue-loader']
			}
	    ]
	  },
	  resolve:{
		  /* extensions:['.js','.css','.vue'], */
		  alias:{
			  'vue$':'vue/dist/vue.esm.js'
		  }
	  }
}

6.结果

十二、plugin

vue里还有很多插件,我们了解一下:(我们先复制一下上面的项目,复制成05)

1.添加版权的plugin

在webpack.config.js中添加plugins:

const path = require('path')
const webpack = require('webpack')


module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			},
			{
				test:/\.vue$/,
				use:['vue-loader']
			}
	    ]
	  },
	resolve:{
		
		  extensions:['.js','.css','.vue'],
		  alias:{
			  'vue$':'vue/dist/vue.esm.js'
		  }
	  },
	plugins:[
		new webpack.BannerPlugin('最终版权归徐鹏所有')
	]
}

重新运行一下,发现版权声明有了:

2.打包html的plugin

我们index.html打包后应该在dist里面,而不是在根目录下面,所以我们要做打包:

(1)安装插件

版本!版本!版本!!!重要的事情说三次。vue的版本太恶心了

npm install [email protected] --save-dev

(2)修改webpack.config.js

记得加逗号啊,铁汁们

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'dist/bundle.js'),
		filename:'main.js',
		publicPath:'dist/bundle.js/'
	},
	module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			},
			{
				test:/\.vue$/,
				use:['vue-loader']
			}
	    ]
	  },
	resolve:{
		
		  extensions:['.js','.css','.vue'],
		  alias:{
			  'vue$':'vue/dist/vue.esm.js'
		  }
	  },
	plugins:[
		new webpack.BannerPlugin('最终版权归徐鹏所有'),
		new HtmlWebpackPlugin()
	]
}

(3)结果

自动生成了index.html。但是有问题:

*1)首先src目录不对,不需要dist/bundle.js

*2)<div id = 'app'>没了,需要一个模板

(4)完善

针对目录的问题:webpack.config.js注释掉publicPath

针对模板的问题:原来的index.html注释掉<script>,然后在webpack.config.js里面加上template属性

.

(5)修改后的结果

3.压缩js的plugin

(1)导入插件

npm install [email protected] --save-dev

(2)webpack.config.js做配置

(3)结果

重启后,打开我们的main.js,就被压缩了(刚刚版权啥的注释也没了。。。)

4.热部署

每次修改都是重新启动一次很麻烦吧?试试热部署:

(1)导入插件

npm install [email protected] --save-dev

(2)webpack.config.js做配置

(3)修改package.json

(4)启动项目

因为我们上一步设置的dev,所以是npm run dev

打开浏览器查看结果:每次修改,浏览器都会实时改变,不需要重新发布

(5)细节

第三步我们可以加一个--open,启动好后自动打开

"dev":"webpack-dev-server --open"

5.配置文件的分离

有的配置文件是在打包用,有的是在测试用,有的发布后要用,这很乱,不好,我们需要分离(先复制一个06项目):

先看看目录结构:(删除webpack.config.js文件,新增build文件夹)

(1)导入插件

npm install [email protected] --save-dev

(2)将开发目录和发布目录分离

base.config.js:(基本同webpack.config.js,但是注释了精简js的插件和热部署)

此处路径有所改变,重新制定了打包路径:

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
	entry:'./src/main.js',
	output:{
		path:path.resolve(__dirname,'../dist/bundle.js'),
		filename:'main.js',
		/* publicPath:'dist/bundle.js/' */
	},
	module: {
	    rules: [
	      {
	        test: /\.css$/,
			/* css-loader:只负责文件加载
				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: 400,
					  name:'img/[name].[hash8].[ext]'
				   },
				  
				 }
			   ]
			}, */
			{
				test: /\.(png|jpg|gif)$/,
				use: [
				  {
					loader: 'file-loader',
					options: {}
				  }
				]
			},
			{
			  test: /\.js$/,
			  exclude: /(node_modules|bower_components)/,
			  use: {
				loader: 'babel-loader',
				options: {
				  presets: ['es2015']
				}
			  }
			},
			{
				test:/\.vue$/,
				use:['vue-loader']
			}
	    ]
	  },
	resolve:{
		
		  extensions:['.js','.css','.vue'],
		  alias:{
			  'vue$':'vue/dist/vue.esm.js'
		  }
	  },
	plugins:[
		new webpack.BannerPlugin('最终版权归徐鹏所有'),
		new HtmlWebpackPlugin({
			template:'index.html'
		}),
		// new UglifyjsWebpackPlugin()
	],
	/* devServer:{
		contentBase:'./dist/bundle.js',
		inline:true//实时页面刷新
	} */
}

dev.config.js:

const webpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')

module.exports = webpackMerge(baseConfig,{
	devServer:{
		contentBase:'./dist/bundle.js',
		inline:true//实时页面刷新
	}
})

prod.config.js:

const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
const webpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')

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

(3)配置package.json,告诉他你修改后的js文件入口在哪里

{
  "name": "webpackconfig",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "xupeng": "webpack --config ./build/prod.config.js",
    "dev": "webpack-dev-server --open --config ./build/dev.config.js"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "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": "^2.0.0",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^1.1.2",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.3",
    "webpack-merge": "^4.1.5"
  },
  "dependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-preset-es2015": "^6.24.1",
    "vue": "^2.6.12",
    "vue-loader": "^12.2.2",
    "vue-template-compiler": "^2.6.12"
  }
}

(4)结果

猜你喜欢

转载自blog.csdn.net/qq_40594696/article/details/110383241