webpack是前端一个项目构建工具,它是基于Node.js开发出来的一个前端工具。
一、webpack的作用:
1.能够处理JS文件的相互依赖关系;
2.能够处理JS的兼容问题,把高级的浏览器不识别的语法,转为低级的,浏览器能正常识别的语法。
webpack.config.js 配置文件
1
2
3
4
5
6
7
8
const path = require('path')
module.exports = {
entry: path.join(_dirname, './src/main.js'), //入口,要打包的文件
output: { //输出文件
path: path.join(_dirname, '/.dist'), //输出的目录
filename: 'bundle.js' //指定输出文件的名称
}
}
二、当在控制台,直接输入webpack命令时,webpack做出了以下几步:
- 首先,webpack发现,我们并没有通过命令的形式给它指定入口和出口;
- webpack就会去项目的根目录中,查找一个叫做
webpack.config.js
的配置文件; - 当找到配置文件后,webpack就会去解析,当解析完配置文件后,就得到了配置文件的中导出的配置对象;
- 当webpack拿到配置对象后,就拿到了配置对象中指定的入口和出口,然后进行打包构建。
三、使用webpack-dev-server
实现自动打包编译功能
- 运行
npm install webpack-dev-server -D
把这个工具安装到项目的本地开发依赖; - 这个工具的用法和webpack用法一样;
- 由于我们本地安装
webpack-dev-server
,所以无法把它当作脚本命令在终端运行;(只有那些安装到全局-g的工具才能在终端中运行) - 如果要正常运行这个工具,要求在本地中,必须安装webpack;
- 这个工具帮我们打包生成
bundle.js
文件并没有放到实际的物理磁盘上;而是直接托管到了电脑的内存中,所以,在项目根目录中找不到打包好的bundle.js
。
四、html-webpack-plugin
当使用html-webpack-plugin
之后,我们不再需要手动处理bundle.js的引用路径了,因为这个插件,已经帮助我们自动创建一个合适的script
,并且,引用了正确路径。
两个作用:
- 自动在内存中根据指定页面生成一个内存的页面;
- 自动把打包好的
bundle.js
追加到页面中去。
五、loader
PS:webpack默认只能打包处理JS类型的文件,无法处理其他非JS类型文件
例如:import ‘./css/index.css’ 会报错
因此要如果要处理非JS类型文件,我们需要手动安装一些合适的第三方loader加载器
- 需要装两个第三方loader:
cnpm i style-loader css-loader -D
; - 打开
webpack.config.js
这个配置文件,在里面新增一个配置节点,叫做module
,它是一个对象;在这个module
对象身上,有个rules
属性,这个rules
是个数组;在这个数组中存放了所有第三方文件的匹配和处理规则;1 2 3 4 5 6 7 8
//eg: module:{ rules:[ { test:/\.css$/,use:['style-loader','css-loader'] } ] //配置处理.css文件的第三方loader规则 }
PS:webpack处理第三方文件类型过程:
- 发现要处理的文件不是JS类型文件,然后就去配置文件中,查找有没有对应的第三方loader规则;
- 如果找到对应的规则,就会调用对应的loader来处理这些文件类型;
- 在调用loader时,是从后往前调用的;
- 当最后一个loader调用完毕,会把处理的结果,直接交给webpack进行打包合并,最终输出到
bundle.js
中去
url-loader
默认情况下,webpack无法处理css文件中的url地址。需要:
安装url-loader:cnpm i url-loader file-loader
; 然后在配置文件上配置。
六、babel
在webpack中默认只能处理一部分ES6的新语法,一些更高级或ES7语法处理不了;这是需要借助第三方babel
来帮助webpack来处理这些高级语法,当第三方babel
把高级语法转为低级语法之后,会把结果交给webpack去打包到bundle.js
中
- 在webpack中,运行两套命令,安装两套包,去安装babel相关的loader功能;
第一套包:
cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
第二套包:cnpm i babel-preset-env babel-preset-stage-0 -D
- 打开webpack的配置文件
webpack.config.js
,在module
节点下的rules数组中,添加一个新的匹配规则:{test: /\.js$/, use: 'babel-loader', exclude: /node_modules/}
PS:必须把
node_modules
目录通过exclude选项排除掉 - 在项目的根目录中,新建一个叫
.babelrc
的babel配置文件,这个配置文件,属于JSON格式,所以,在写配置时必须符合JSON语法规范;1 2 3 4 5
//配置如下: { "presets": ["env", "stage-0"], "plugins": ["transform-runtime"] }
七、使用vue实例的render方法渲染组件
1
2
3
4
5
6
//eg:
render: function(createElements){
//这里createElements是一个方法,调用它,能够把指定的组件模板渲染为html结构
return createElements(login)
//注意:这里return的结果,会替换页面中el指定的那个容器(也就是<div id="#app"></div>)
}
PS:在webpack中,如果想要通过vue,把一个组件放到页面中显示,vm实例中的render
可以实现
八、webpack中如何使用vue:
- 安装vue的包:
cnpm i vue -S
; - 由于在webpack中,推荐使用
.vue
这个组件模板文件定义组件,所以需要安装能解析这种文件的loader
:cnpm i vue-loader vue-template-compiler -D
,然后在配置文件webpack.config.js
中,新建loader配置项:{test:/\.vue$/, use: 'vue-loader'}
; - 在
main.js
中,导入vue模块import Vue from 'vue'
; - 定义一个
.vue
结尾的组件; - 在
main.js
中使用import login from './login.vue'
导入这个组件; - 创建vm实例
var vm = new Vue({el:'#app", render: c => c(login)})
; - 在页面中创建id为app的容器。
PS:使用
import Vue from 'vue'
导入的Vue构造函数,功能不完整,只提供了runtime-only
的方式,并没有提供先网页中那样的使用方式。
解决方法:在
webpack.config.js
配置文件上,加上如下配置:
1 2 3 4 5 resolve:{ alias: {//修改vue被导入时包的路径 "vue$': "vue/dist/vue.js" } }
九、结合webpack使用vue-router
- 导入
vue-router
包:import VueRouter from 'vue-router'
- 手动安装VueRouter:
Vue.use(VueRouter)
- 创建路由对象
1 2 3
var router = new VueRouter({ routes:[......] })
- 将路由对象挂载到vm实例上
十、export default 和 export使用方法
export default
- 向外暴露成员,可以用任意变量接收
eg:
var info = {name: "Mike"}; export default info;
接收:import aaa(任意名) from './...'
- 在一个模块中,
export default
只允许向外暴露一次 - 在一个模块中,可以同时使用
export default
和export
export
- 使用
export
向外暴露成员,只能使用{ }的形式接收,这种形式叫做[按需导出];eg:
export var name = 'Mike'
接收:import {name} from './...'
export
可以向外暴露多个成员,(也就是说可以使用多次);export
导出成员时,必须用导出时的名称,来使用{ }按需接收;- 如果想换个名称接收,可以使用
as
来起别名;eg:
import {name as changeName} from './...'