1.新建项目myCli
2.首先创建一个index.html。
肯定需要一个html页面,不然没有页面
3.创建id挂载点。
因为是vue项目,至少有一个挂载点,给vue的el挂载
4.引入打包后的js(bundle.js)。
引入打包后的代码。还需要引入vue、自己代码,但是不想一个个引入,可以用webpack,将我们所以的代码打包成一个js文件,直接引入打包后的js就行。我们自己写的代码写在main.js中
5.创建两个文件夹,src、dist(分发到服务器)。
区分了打包前(自己写的)和打包后(准备分发的文件夹),在src中写自己的文件夹,因为我们需要在index.html中引入dist中的打包后文件夹(bundle.js),所以可以直接将index.html放入dist中。以上就是目录安排
6.在src中创建入口文件main.js。
新建vue组件并挂载到index中的挂载点
指定元素el:'#app',render:h=>h(App)(创建渲染函数,因为是函数,所以有参数, 参数为h创建一个虚拟节点,返回值是运行函数结果。)
过程:拿到App对象,将对象传给h函数,如果render运行,就会创建App对应的vNode虚拟节点,将虚拟节点替换掉app元素。
import Vue from 'vue'
import App from './App.vue'
new Vue({
el: '#app',
render: h => h(App)
})
7.引入需要的依赖
-
引入ui库:element-ui。
当然,也可以不引入,引入自己的ui库也行
其中这两个都是普通依赖,需要放到package.json中的dependency里面
-
引入开发依赖:npm i axios
安装好后,会发生一些问题:bundle还不存在,所以还需要webpack打包,接下来安装一些webpack依赖和对应的loader依赖
-
继续安装依赖:npm i -D webpack webpack-cli vue-loader vue-template-compiler sass-loader sass css-loader style-loader babel-loader @babel/core @babel/preser-env
webpack(打包器本体)webpack-cli(终端命令,调用webpack)
(loader的作用进行代码转换,新语法转老语法)vue-loader(vue转换为js)vue-template-compiler(将vue中html转化的包)sass-loader(转化sass)sass(sass本体)css-loader(转换css)style-loader(css处理好后还需要style标签加到html页面中)babel-loader(转化js,js会用新语法,需要兼容老浏览器)@babel/core(babel的核心库)@babel/preset-env(预设配置,babel设置好的配置)(这里全都用开发依赖装,默认就行)
8.配置webpack
-
创建webpack.config.js。
目标是在main.js开始编译、打包,打包到dist文件夹,所以要配置文件中配置,在项目根目录中创建webpack.config.js
-
搭建webpack.config.js框架。
- entry:入口
- output:打包后放到哪个文件夹,叫什么名字(path、filename)
- mudule:rules(是一个数组,会去匹配对应的扩展名,比如说是不是以 .vue 结尾的,这里通过test校验正则,通过use使用哪个loader(可以用数组))
- plugins:插件的作用,增强 webpack功能,相当于游戏里的'外挂',是个数组,因为可以放多个插件,插件提供过来的时候,都是构造函数,所以需要new PluginA()
-
填充webpack配置文件
-
使用module.exports暴露
module.exports和exports是属于commonJs规范,export和export default是ES6模块规范
exports等于module.exports,exports是一个对象,可以有多个值
写个代码体会一下:
exports.fn1; exports.fn2; exports.fn3; // 等价于 exports={fn1,fn2,fn3}; module.exports={fn1,fn2,fn3}; -
entry入口。
main作为入口文件,可以用绝对路径,也可以用相对路径
-
output出口。
设置path。path不能是相对路径,这里可以用
__dirname,这个是node变量,就是当前文件所在的目录字符串保存,__dirname+'/dist',这里会有路径的问题,因为Linux路径是/这个斜杠,wndow是\,需要表示\需要进行转义,所有就是两个\,所有就不统一了,那怎么办?可以使用path模块,这个是node自带的模块,会判断当前所处的操作系统,从而自动使用最合适的目录分隔符去拼接目录。path中有个resolve方法,运行它,并且提供两个参数,将它们拼起来,就不用自己操心写什么斜杠了path:path.resolve(__dirname,'dist')。设置filename。我们希望打包后的文件名为 bundle.js 直接给filename设置即可
-
定义模块转换规则。
处理.vue。使用vue-loader
处理.s[ca]ss。使用style-loader、css-loader、scss-loader
处理.m?js。使用babel-loader,这里注意babael需要配置项,可以使用预设配置项@babel/preset-env
处理图片。老版本是使用file-loader,然后配置一些项。新版本是使用type:'asset/resourse'
一句话概括:使用对应loader,处理对应文件
-
配置plugins。
目前只需要配置一个插件,VueLoaderPlugin,这个是vue-loader的库里的插件,处理vue文件中的js和css
-
完整代码
const path = require('path') // 按需导入vue-router中的VueLoaderPlugin const {VueLoaderPlugin} = require('vue-loader') // 区分exports、module.exports和export、export default的区别 module.exports = { // 入口文件 entry:'./src/main.js', // 出口文件,包括名字和地址 output:{ // 路径不能使用绝对路径,需要使用绝对路径,所以需要借助__dirname,这里引入path适配不同操作系统 path:path.resolve(__dirname,'dist'), filename:'bundle.js' }, // 模块文件,定义模块转换规则 module:{ rules:[ {test:/.vue$/,use:'vue-loader'}, {test:/.s[ca]ss$/,use:['style-loader','css-loader','scss-loader']}, { test:/.m?js$/, use:{ loader:'babel-loader', options:{ presets:['@babel/preset-env'] } } }, {test:/.(png|jpe?g|gif|svg|webp)$/,type:'asset/resource'} ] }, // 插件,增强webpack功能,需要组件实例 plugins:[ // 这个是vue-loader的库里的插件,处理vue文件中的js和css new VueLoaderPlugin() ] }
-
9.打包
-
运行webpack
终端输入 webpack,报错了!
提示消息:CLI for webpack must be installed.(必须安装webpack命令行。)
我们不是安装了webpack了吗?
-
配置打包命令行。
如果直接在终端输入 webpack,会报错,因为没有这个命令。刚刚我们已经装了webpack-cli,按道理应该是有这个命令的,为什么呢?因为它安装到了我们的node_module/bin/webpack中,如果要运行需要找到这个文件位置下的webpack
./node_module/bin/webpack此时就能运行成功,成功打包(如果没有设置模式,那么默认是生产模式)。
打包成功!
-
简化命令
但是每次打包都要输入那么长的命令,很麻烦。为了简化操作,我们可以在package.json中设置scripts:{"serve":"webpack --mode=development/production --watch"}(这里可以是dev也可以serve新版本叫法),注意这里是不需要写node_module/bin/webpack这种具体位置,因为npm脚本会自动找文件。这里需要给它设置模式,设置为生产模式(除了编译转换打包外,还会优化代码,用户访问更快)
watch的作用:只要有watch,就不需要手动运行,会自动运行。
此时,运行 npm run webpack 就可以进行打包了,打包完成会生成dist文件夹,里面有bundle.js,我们可以使用在线服务器运行,此时,我们修改代码时,保存会自动打包(因为加了watch)
-
bug。
- 这里我们在打包的时候出现了一些问题,主要是版本问题,通过google解决。
- 还有一个就是打包后,页面没有效果的问题。首先需要知道的是,webpack打包后,会生成一个bundle.js文件,这个是最关键的,那我们在浏览器上需要运行index.html,注意:index.html需要引入打包后的bundle.js文件,也需要给一个挂载点。
10.配置路由
可以配置的很多,例如:eslint、vuex等等,这里用配置路由举例。
- 安装vue-router
-
配置router。
src文件夹下创建router文件夹再创建index.js。需要做的是:router里面创建vue-router实例,导出来。
步骤:导入vue-router(下载的),创建vueRouter实例,配传入配置项(子路由routes:[]),保存到常量router,导出router实例。
-
注册router。
这里跟注册elementUi一样,我们在router中直接注册vueRouter,通过use。注册完成,main中导入router,此时router导入的是vueRouter实例
-
使用router。
在App.vue中,添加路由占位符
<router-view>,这个是路由器提供的动态视图插槽,会根据router中的routes配置,然后动态渲染成配置中的组件。跳转的两种方式:<router-link to="/Home">(组件跳转)和this.$router.push('/Home')(编程式,就是写js代码形式),这里的routerlink和routerview都是vue-router提供的组件
- 创建views(pages),定义多个页面,首先是Home.vue,首页内容;再定义About.vue,关于页面内容。
到这里,webpack5+vue2模板的基本功能就实现了!🤗