从零开始搭Vue项目,主要是想脱离对脚手架全家桶的依赖,以及从中深入学习一点webpack相关的知识,不要每次打开package.json以及webpack的配置文件都一脸懵逼。
新建项目
1 | mkdir vue-cli-webpack |
使用npm init
生成package.json文件
1 | npm init |
执行上述命令后,在项目文件夹下生成了package.json
文件。
文件中的各个字段介绍:package.json文件
引入webpack
webpack使用教程:webpack
1 | npm install webpack --save-dev |
然后创建一些必要的文件:
1 | touch index.html |
main.js文件如下:
1 | console.log("hello world"); |
index.html文件如下:
1 |
|
创建webpack.config.js文件
在项目目录下执行下面指令,懒的话直接gui创建就行了。
1 | mkdir config |
webpack.config.js文件内容如下:
一定要注意路径,不然很容易翻车车。
1 | const path = require('path'); |
使用webpack命令编译项目
需要在webpack.config.js文件所在的目录下执行下面的命令:
1 | cd config |
执行完毕后会在项目目录下生成dist文件夹(包括打包好的bundle.js文件)。此时项目目录结构如下:
此时用浏览器打开index.html文件,控制台打印如下:
引入vue
在项目目录下执行下面指令:
1 | npm install vue |
修改main.js文件
1 | import Vue from 'vue'; |
引入babel
1 | npm install --save-dev babel-core babel-loader |
由于在使用vue时会用到很多es6的语法,但是现在很多浏览器对es6的支持不是很好,所以在编译时需要将这些语法转换es5的语法,此时我们使用babel来进行编译。
配置webpack.config.js
1 | //loader 用于对模块的源代码进行转换。 |
执行webpack
命令重新打包,打开index.html,打印如下:
因为正在使用的是vue的运行时版本,而此版本中的编译器时不可用的,我们需要把它切换成运行时 + 编译的版本,需要在配置文件中添加如下代码 :
1 | //这些选项能设置模块如何被解析。 |
webpack一些常用配置
在项目的实际开发中我们还会引入css、图片以及字体等资源文件。这些文件的引入都需要相应的加载器才能将其加载到项目中并正常使用。
下面只介绍部分我们需要的加载器的使用方法, 更多信息请查阅webpack加载器文档。
css加载器
1 | npm install --save-dev css-loader style-loader |
配置webpack.config.js的loader规则
1 | //配置css-loader |
新增一个样式文件:
1 | cd src |
main.css如下:
1 | #p-text{ |
在main.js中引入main.css
1 | import './styles/main.css' |
重新编译程序,打开index.html如下:
配置图片资源加载器
使用file-loader或者url-loader加载器进行加载,他们都是用于打包文件和图片资源的,两者的区别是url-loader在file-loader的基础上进行了一次封装。
在访问网站时如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl(base64编码,优化方案之一)。相当于把图片数据翻译成一串字符,再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。
当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。
此处我们使用url-loader,由于它是基于file-loader的封装,所以也需要引入file-loader。
1 | npm install --save-dev file-loader url-loader |
配置webpack.config.js:
1 | //配置url-loader |
接下来引入图片,修改main.js如下:
1 | import Vue from 'vue'; |
重新打包编译,效果如下:
查看bundle.js文件,图片已经被转码:
字体加载
字体的加载方式与图片的一样也是用url-loader,配置如下 :
1 | //配置字体 |
HtmlWebpackPlugin 插件
这个插件用来简化创建服务于 webpack bundle 的 HTML 文件,尤其是对于在文件名中包含了 hash 值,而这个值在每次编译的时候都发生变化的情况。你既可以让这个插件来帮助你自动生成 HTML 文件,也可以使用 lodash 模板加载生成的 bundles,或者自己加载这些 bundles。
1 | npm install --save-dev html-webpack-plugin |
在webpack.config.js中配置插件:
1 | //插件目的在于解决 loader 无法实现的其他事。 |
删除index.html中的下面部分代码:
1 | <script src="dist/bundle.js"></script> |
在config目录下执行webpack
重新打包编译,此时目录结构如下:
此时打开dist文件夹下的index.html,效果如下(本次图片大小大于10k):
webpack-dev-server
在我们实际开发中需要将代码部署在server中,而不是在浏览器中直接打开文件。此时我们需要使用webpack的 webpack-dev-server 。
webpack-dev-server 为我们提供了一个简单的web服务器,并且能够实时重新加载(live reloading)。
1 | npm install --save-dev webpack-dev-server |
在webpack.config.js 文件中需要指定一个文件夹,告诉开发服务器需要从哪儿加载文件:
1 | //告知开发服务器需要从哪儿加载文件 |
配置package.json
的script
脚本:
1 | "scripts": { |
重新修改webpack.config.js中的路径信息如下:
1 | const path = require('path'); |
现在就可以愉快的执行下面的指令:
1 | npm run dev |
vue-loader
在vue的开发过程中,通常我们需要写.vue结尾的文件即组件,如app.vue。需要通过vue-loader来进行加载,现在我们需要做如下配置。通过 vue-loader 和vue-template-compiler来加载并编译.vue文件。
1 | npm install --save-dev vue-loader vue-template-compiler |
Vue Loader 的配置和其它的 loader 不太一样。除了通过一条规则将 vue-loader
应用到所有扩展名为 .vue
的文件上之外,还要确保在webpack 配置中添加 Vue Loader 的插件:
webpack.config.js 中
1 | //loader |
新建app.vue:
1 | <template> |
修改main.js:
1 | import Vue from 'vue'; |
重新执行npm run dev
,即可查看效果。
结束
到这里就差不多结束了。接下来就需要什么下什么,vue-router,vuex之类的。
整份代码请戳:vue-cli-webpack
还有推荐一个包分析工具:webpack-bundle-analyzer