安装环境 1 2 3 4 sudo pacman -S npm sudo npm install --registry=https://registry.npmmirror.com -g vue vue-cli # 前段打包工具 sudo npm i --registry=https://registry.npmmirror.com -g webpack webpack-cli
由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命令 cnpm,安装使用介绍参照:使用淘宝 NPM 镜像 。
vue-cli vue-cli
就是一个脚手架,步骤很简单,输入几个命令之后就会生成整个项目,里面包括了webpack、ESLint、babel
很多配置等等
vue-cli创建项目 1 2 3 4 5 vue --help # 下面命令中就有如何创建一个项目 vue-init --help # 执行创建命令后等待就可以了 vue init webpack vue_1
项目参数
这里有几个需要说明一下,没说明的直接回车选择默认就好,对项目没多大影响,很傻瓜式:
Project name
: 这个是项目名称,默认是输入时的那个名称,想改的话直接输入修改,也可以直接回车
Install vue-route
: 是否需要vue-router
,这里默认选择使用,这样生成好的项目就会有相关的路由配置文件
Use ESLint to lint your code
: 是否使用ESLint
,刚才说了我们这个项目需要使用所以也是直接回车,默认使用,这样会生成相关的ESLint
配置
Setup unit tests with Karma + Moch?
: 是否安装单元测试。由于我们现在还没有单元测试,所以这里选择的是”N”,而不是直接回车哦
Setup e2e tests with Nightwatch
: 是否安装e2e
测试,这里我也同样选择的是“N”
这几个配置选择yes 或者 no 对于我们项目最大的影响就是,如果选择了yes 则生成的项目会自动有相关的配置,有一些loader我们就要配套下载。所以如果我们确定不用的话最好不要yes,要么下一步要下很多没有用的loader
项目目录:
1. build 文件夹: 1 2 3 4 5 6 7 8 build.js logo.png vue-loader.conf.js webpack.dev.conf.js check-versions.js utils.js webpack.base.conf.js webpack.prod.conf.js
如上,这个文件夹主要是进行webpack的一些配置,就我个人觉得啊~对我们最有用并且可能会使用的就是webpack.base.config.js、webpack.dev.config.js、webpack.prod.config.js三个webpack的配置文件 ,分别是基本webpack配置、开发环境配置、生产环境配置。实际上这些文件里面的内容,一些简单的配置都已经有了,包括入口文件、插件、loader、热更新等都已经配置好了。我们要做的只是根据自己的项目有什么loader需要增加的,比如生成环境需要加上UglifyJsPlugin插件等可以自行配置,或者一些插件增加或者不需要的删除,其实都是和业务相关了,其他的都可以不需要动 。
2. config 文件夹: 1 2 3 4 4月 23 09:59 dev.env.js 4月 23 09:59 index.js 4月 23 09:59 prod.env.js 4月 23 09:59 test.env.js
这几个配置文件我觉得最主要的就是index.js 这个文件进行配置代理服务器 ,这个地方和我们息息相关,和后台联调就是在这里设置一个地址就可以了。打开index.js 找到“proxyTable“这个属性,然后在里面加上对应的后台地址即可 ,构建生成环境也在这里配置,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 'use strict' const path = require ('path' )module .exports = { dev : { assetsSubDirectory : 'static' , assetsPublicPath : '/' , proxyTable : {}, host : 'localhost' , port : 8080 , autoOpenBrowser : false , errorOverlay : true , notifyOnErrors : true , poll : false , useEslint : true , showEslintErrorsInOverlay : false , devtool : 'cheap-module-eval-source-map' , cacheBusting : true , cssSourceMap : true }, build : { index : path.resolve (__dirname, '../dist/index.html' ), assetsRoot : path.resolve (__dirname, '../dist' ), assetsSubDirectory : 'static' , assetsPublicPath : '/' , productionSourceMap : true , devtool : '#source-map' , productionGzip : false , productionGzipExtensions : ['js' , 'css' ], bundleAnalyzerReport : process.env .npm_config_report } }
3. src文件夹: 1 2 3 4 5 4月 23 09:59 assets 4月 23 09:59 components 4月 23 09:59 router 4月 23 09:59 App.vue 4月 23 09:59 main.js
这个文件夹是整个项目最主要以及使用频率最高的文件夹。
4.static 文件夹: 存放的文件不会经过webpack处理,可以直接引用,例如swf文件如果要引用可以在webpack配置对swf后缀名的文件处理的loader,也可以直接将swf文件放在这个文件夹引用
5.package.json: 这个文件有两部分是有用的:scripts 里面设置命令,例如设置了dev用于调试则我们开发时输入的是npm run dev
;例如设置了build 则是输入 npm run build
用于打包;另一部分是这里可以看到我们需要的依赖包,在dependencies和devDependencies中,分别对应全局下载和局部下载的依赖包
下载依赖包 1 npm install --registry=https://registry.npmmirror.com
运行 npm run dev
当所有依赖包都下载好之后,输入命令:npm run dev
运行就可以看到一个自带的默认页面打开。此时项目就已经全部搭建好并且运行了~炒鸡简单吧,总结下来其实只有四步
npm install --global vue-cli
下载vue-cli脚手架
vue init webpack vue_1
生成项目,形成基本结构
npm install # 依赖包
npm run dev
运行
打包 npm run build
第一个demo Webpack 入门教程 Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。
接下来我们简单为大家介绍 Webpack 的安装与使用。
创建项目 接下来我们创建一个目录 app:
在 app 目录下添加 maxzhao1.js 文件,代码如下:
app/maxzhao1.js 文件 1 document .write ("It works." );
在 app 目录下添加 index.html 文件,代码如下:
app/index.html 文件 1 2 3 4 5 6 7 8 <html > <head > <meta charset ="utf-8" > </head > <body > <script type ="text/javascript" src ="maxzhao_bundle.js" charset ="utf-8" > </script > </body > </html >
接下来我们使用 webpack 命令来打包:
1 webpack-cli maxzhao1.js -o maxzhao_bundle.js
执行以上命令会编译 maxzhao1.js
文件并生成maxzhao_bundle.js
文件,成功后输出信息如下所示:
1 2 3 4 5 6 Hash: a41c6217554e666594cb Version: webpack 1.12.13 Time: 50ms Asset Size Chunks Chunk Names bundle.js 1.42 kB 0 [emitted] main [0] ./maxzhao1.js 29 bytes {0} [built]
在浏览器中打开 index.html
,输出结果如下:
创建第二个 JS 文件 接下来我们创建另外一个 js 文件 maxzhao2.js
,代码如下所示:
app/maxzhao2.js 文件 1 module .exports = "It works from maxzhao2.js." ;
更新 maxzhao1.js 文件,代码如下: 1 document .write (require ("./maxzhao2.js" ));
接下来我们使用 webpack 命令来打包: 1 webpack maxzhao1.js -o maxzhao_bundle.js
1 2 3 Entrypoint main = maxzhao_bundle.js [0] ./maxzhao1.js 42 bytes {0} [built] [1] ./maxzhao2.js 46 bytes {0} [built]
在浏览器访问index.html
,输出结果如下所示:
Loader:加载其它文件 Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。
所以如果我们需要在应用中添加 css 文件,就需要使用到 css-loader 和 style-loader,他们做两件不同的事情,css-loader 会遍历 CSS 文件,然后找到 url() 表达式然后处理他们,style-loader 会把原来的 CSS 代码插入页面中的一个 style 标签中。
安装css-loader
和style-loader
接下来我们使用以下命令来安装css-loader
和style-loader
(全局安装需要参数 -g)。
1 2 3 4 npm i css-loader style-loader ls # 多了一个文件夹 node_module 和文件 pack-lock.json # ` node_modules `目录,它就是 css-loader 和 style-loader 的安装目录。
使用 接下来创建一个 style.css 文件,代码如下: 1 body { background : yellow; }
修改 maxzhao1.js 文件,代码如下: 1 2 require ("!style-loader!css-loader!./style.css" );document .write (require ("./maxzhao2.js" ));
编译:webpack maxzhao1.js -o maxzhao_bundle.js
require CSS
文件的时候都要写 loader
前缀 !style-loader!css-loader!
,当然我们可以根据模块类型(扩展名)来自动绑定需要的loader
。 将maxzhao1.js
中的 require("!style-loader!css-loader!./style.css")
修改为require("./style.css")
:
1 require ("./style.css" ); document .write (require ("./maxzhao2.js" ));
然后执行:
1 webpack maxzhao1.js maxzhao_bundle.js --module-bind 'css=style-loader!css-loader'
配置文件:配置编辑选项 我们可以将一些编译选项放在配置文件中,以便于统一管理:
创建 webpack.config.js 文件,代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 module .exports = { entry : "./maxzhao1.js" , output : { path : __dirname, filename : "maxzhao_bundle.js" }, module : { loaders : [ { test : /\.css$/ , loader : "style-loader!css-loader" } ] } };
接下来我们只需要执行webpack
命令即可生成maxzhao_bundle.js
文件:
1 webpack Hash: 4fdefac099a5f36ff74b Version: webpack 1.12.13 Time: 576ms Asset Size Chunks Chunk Names bundle.js 11.8 kB 0 [emitted] main [0] ./runoob1.js 65 bytes {0} [built] [5] ./runoob2.js 46 bytes {0} [built] + 4 hidden modules
webpack
命令执行后,会默认载入当前目录的webpack.config.js
文件。
其它 vue-router懒加载
单页面应用,如果没有应用懒加载,第一次进入时,需要加载的内容过多,会出现长时间的白屏,不利于用户体验,运用懒加载则可以将页面进行划分,需要的时候加载相对应的页面,可以有效减少第一次加载的压力和用时。
router文件夹下的index.js原路由加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorld' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld } ] })
修改为懒加载
1 2 3 4 5 6 7 8 9 10 11 12 13 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) export default new Router({ routes: [ { path: '/', component: resolve => require(['@/components/HelloWorld'], resolve) } ] })
配置sass及屏幕适配 配置sass 1.安装sass-loader及node-sass
1 npm install sass-loader node-sass --save-dev
2.使用 在.vue文件中的style中添加 lang=’scss’,例如
1 2 3 4 5 6 <style scoped lang='scss'> $t-base:#32ba90; .wrap{ color: $t-base; } </style>
移动端—屏幕适配 1.在src文件夹中新建一个文件夹styles,并新建两个scss文件 — mixin.scss / reset.scss mixin.scss
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $SCALE: 10; $BASE: 375 / $SCALE;//375为设计图尺寸 // 超过显示省略号 @mixin ellipsis { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } //多行文本,超过显示省略号 @mixin moreLine($num){ display: -webkit-box; /** 对象作为伸缩盒子模型显示 **/ -webkit-box-orient: vertical; /** 设置或检索伸缩盒对象的子元素的排列方式 **/ -webkit-line-clamp: $num; /** 显示的行数 **/ overflow: hidden; /** 隐藏超出的内容 **/ } @function rem ($px) { @return ($px / $BASE) + rem }
reset.scss
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 @import './mixin.scss'; $size_small:rem(12); $size_middle:rem(14); $size_default:rem(16); $size_big:rem(18); $text_color: #666; $bg_color: #32ba90; $border_color: #dedede; body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, li, a, p, h1, h2, h3, h4,h5, h6, i, b, em,textarea, button, input, select, figure, figcaption { padding: 0; margin: 0; list-style: none; text-decoration: none; border: none; font-weight: normal; font-family: PingFangSC-Light,helvetica,'Heiti SC'; box-sizing: border-box; font-size: 14px; -webkit-tap-highlight-color:transparent; -webkit-font-smoothing: antialiased; &:hover{ outline: none; } } a, a:visited { text-decoration: none; color: #333; } input:focus { outline: none; border: none; } html, body { width: 100%; height: 100%; -webkit-font-smoothing: antialiased; background: #fff; color: #333; padding: 0; margin: 0; } // 禁止用户选中 body{ -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } ::-webkit-scrollbar { display: none; } .fl{ float: left; } .fr{ float: right; } .clearfix:after{ /*最简方式*/ content: ''; display: block; clear: both; } .clearfix{ /*兼容 IE*/ zoom: 1; }
2.在App.vue文件中设置html的font-size
1 2 3 4 5 6 7 8 9 10 11 12 13 <script> import {mapGetters,mapActions} from 'vuex' export default { name: 'App', mounted () { // 设置html的font-size document.addEventListener('DOMContentLoaded', function () { const html = document.querySelector('html'); html.style.fontSize = window.innerWidth / 10 + 'px'; }); } } </script>
3.mixin.scss则需要在所需的.vue文件中的style中引入,例如components中的HelloWorld.vue
1 2 3 4 <style scoped lang='scss'> @import '../styles/reset.scss'; /*可使用mixin和reset中的变量及方法*/ </style>
数据请求axios 1.安装axios 1 npm install axios --save
2.在src文件夹中新建api文件夹,并新建index.js文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import axios from 'axios'; var qs = require('qs'); if (process.env.NODE_ENV === 'development') { axios.defaults.baseURL = ''; //''里面填写请求域名 } import VueRouter from 'vue-router'; //get请求方式 export const home = () => { return axios.get('/api/index'); } //post请求方式(包含参数) export const article = (id)=>{ const params = qs.stringify({'id':id}); return axios.post('/api/article', params); }
3.调用接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script> import {home} from '@/api';//引入 export default { data () { return { } }, mounted () { const self = this; home().then(r => {//调用接口 let res = r.data; console.log(res) }); }, } </script>
Toast提示
1.创建一个普通的Toast提示组件 src/components/toast/index.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <template> <div v-if="showToast" class="toast" > <p>{{ toastTitle }}</p> </div> </template> <script> export default { data: () => ({ showToast: false, toastTitle: '', }), methods: { show (params) { this.toastTitle = params; this.showToast = true }, }, watch: { toastTitle: function(val) { if (val) { this.showToast = true; setTimeout(() => { this.showToast = false; this.toastTitle=''; }, 2000) } return val; } } } </script> <style scoped lang='scss'> @import '../../styles/mixin.scss'; .toast { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(49, 49, 49, 0.8); color: #fff; border-radius: rem(5); z-index: 999; text-align: center; font-size: rem(14); p{ margin: 0; padding: rem(4) rem(10); } } </style>
2.将组件注册成为plugin src/components/toast/plugin.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import Toast from './index' export default { install (Vue, options = {}) { const VueToast = Vue.extend(Toast) let toast = null function $toast (params) { return new Promise(resolve => { if (!toast) { toast = new VueToast() toast.$mount() document.querySelector(options.container || 'body').appendChild(toast.$el) } toast.show(params) resolve() }) } Vue.prototype.$toast = $toast } }
3.在main.js中载入 1 2 3 //toast import toast from './components/toast/plugin' Vue.use(toast)
4.在页面中使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <template> <div class="wrap"> <button class="btn" @click="showToast">show toast</button> </div> </template> <script> export default { data () { return { } }, methods: { showToast () { this.$toast('toast') } } } </script>
第一个项目 前言 我这里安装好之后直接就带router
了,对与我这个没入门的人来说有点难度,但我就喜欢迎难而上!
下面所有的介绍都会包含路由了,刚刚开始的时候,会避开路由。
插曲:我的系统是Manjaro
所以我安装了atom
,挺方便快捷的;
创建 1 2 3 4 vue-init webpack vue_maxzhao # 一路回车就可以了 cd vue_maxzhao npm i
查看基础帮助
启动
打开http://localhost:8080 文件就会出现默认效果。
测试基础模块语法 Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
插值 文本 数据绑定最常见的形式就是使用
(双大括号)的文本插值:
NPM 帮助 安装模块 1 2 3 4 5 6 7 8 9 10 11 12 dependencies 装载:npm install vue --save-prod 卸载:npm uninstall vue --prod devDependencies 装载:npm install vue --save-dev 卸载:npm uninstall vue --dev -P 相当于 --save-prod, 添加dependencies 里面所有的包。在 -D -O 不存在时,-P 就是默认值 。 也可以写全称: --save-production -S 相当于 --save; 添加dependencies 里面所有的包。 -D 相当于 --save-dev; 添加devDependencies 里面所有的包, -O 相当于 --save-optional, 添加在 optionalDependencies 里面的包, --no-save: 阻止保存记录在dependencies 中。
更新模块 1 2 3 4 5 6 sudo npm i -g npm-check-updates ncu -u npm i
错误问题 To install it, you can run: npm install –save !!vue-style-loader!css-loader? 1 npm install node-sass -D
然后参考 上面的模块更新操作.
Module build failed: TypeError: this.getResolve is not a function sass-loader版本太高了
1 "sass-loader" : "^7.3.1" ,
本文地址:Vue我的首次遇见
本文地址: https://github.com/maxzhao-it/blog/post/20956/