Vue2 + webpack + express4构建单页应用(二)

根据Vue2 + webpack + express4构建单页应用(一)已经构建了一个基本的小应用,但是还没有解决jquery的ajax请求、style模块中使用less等问题

一、实现异步请求及转发

1.客户端发起请求

一直实现异步请求都是用ajax(XMLHttpRequest)来实现的 ,最近兴起了ajax的替代技术fetch,XMLHttpRequest 是一个设计粗糙的 API,不符合关注分离(Separation of Concerns)的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise,generator/yield,async/await 友好。

Fetch 的出现就是为了解决 XHR 的问题。

我在github上选择了一个支持前后端同构的fetch插件:https://github.com/matthew-andrews/isomorphic-fetch

在项目中执行 npm install --save isomorphic-fetch es6-promise 下载插件,可以在需要的地方按照下面方式使用:

import es6Promise from 'es6-promise';
import fetch from 'isomorphic-fetch';
es6Promise.polyfill();

fetch('//offline-news-api.herokuapp.com/stories')
    .then(function(response) { 
        if (response.status >= 400) { 
            throw new Error("Bad response from server"); } return response.json(); }
     )     
    .then(function(stories) { console.log(stories); });

一般在项目中会将以上代码抽离出来写成一个方法单独抽离出成一个文件,使用时引入文件调用该方法

2.node端转发异步请求

node有一个http转发的中间件http-proxy-middleware

npm install http-proxy-middleware --save 下载中间件

然后在app.js中引入中间件并注册

var proxy = require('http-proxy-middleware');
app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));

详细使用,参考 https://github.com/chimurai/http-proxy-middleware#options

二、使用less预编译语言

现在写样式一般可以使用预编译语言less或者sass

根据个人习惯我选用的less,使用less需要有一下配置:

1.在.vue文件中的<style>需要加上lang="less"属性,如:

<style lang="less">

2.下载less-loader、less插件,npm install --save-dev less-loader less

3.在webpack.base.conf.js中加上postcss: [require('autoprefixer')()],如下:

vue: { 
    loaders: {  js: 'babel' }, 
    postcss: [require('autoprefixer')()]
}

这样就可以在.vue中的style里边写less语法了

三、将.vue中的css单独提出来成一个css文件

需要使用webpack的extract-text-webpack-plugin插件

参考文档:https://vue-loader.vuejs.org/en/configurations/extract-css.html

npm install extract-text-webpack-plugin --save-dev

一般只需要在生成环境提取出来,于是在webpack.prod.conf.js中添加

vue: { 
    loaders: {  
        css: ExtractTextPlugin.extract('vue-style-loader', 'css'),  
        // you can also include <style lang="less"> or other langauges  
        less: ExtractTextPlugin.extract('vue-style-loader', 'css!less')
    }
}

在plugins中加入new ExtractTextPlugin("static/css/style.css"),这样css就是在output/static/css中生成style.css文件

四、引用图片

如果template中或style中引用了图片,需要添加file-loader

参考:https://vue-loader.vuejs.org/en/configurations/asset-url.html

1.下载file-loader npm install --save-dev file-loader
2.在webpack.base.conf.js中的loaders里边添加

 {
    test: /\.png$|\.jpg$|\.gif$|\.ico$/, 
    loader: "file?name=static/img/[name].[hash].[ext]", 
    exclude: /node_modules/
}

五、实现懒加载(按需加载)

在页面比较多的时,单页应用按照之前的方式打包成一个js会导致首页加载时很慢,为了解决这个问题,可以修改打包,让首页只加载通用代码和首页要用到的代码,跳转到其他页面再加载对应页面的js,这样可以解决项目较大首页加载缓慢的问题。

官方文档地址

1.修改路由

将要通过懒加载的路由的compenent改写成

const Plugin = r => require.ensure([], () => r(require('../views/Plugins/plugin')), 'Plugin');

具体路由页面如下:

Paste_Image.png

2.修改webpack配置

在webpack.prod.conf.js中的output中添加

chunkFilename: 'static/js/[id].[name]_[chunkhash:7].js'

运行 npm run build 这个时候就可以看到每一个require.ensure引入的模块都单独生成了一个js

Paste_Image.png

运行npm run prod启动生产环节,访问页面http://localhost:3001/
因为我没有定义首页路由,所以会跳转到下面模块中:

Paste_Image.png

查看请求,只请求了index.js和notFoundComponent.js。

Paste_Image.png

访问我定义的路由的http://localhost:3001/plugin(根据你自己定义的路由查看),可以看到除了公用的index.js以为,其他js并没有加载,如果通过路由跳转的话也不用重新加载index.js

Paste_Image.png

细心的你如果仔细看的话会发现一个问题,除了app.vue里边的css打包到style.css外,其他vue里的js并没有打包进去

于是还需要在webpack.prod.conf.js的plugins中将

new ExtractTextPlugin("static/css/style.css")

修改为

//实现css分块,讲所有vue文件中的css打包到一个一个入口css中
new ExtractTextPlugin('static/css/[id].[name]_[chunkhash:7].css', { 
    allChunks: true
})

//加上这个插件,可以将通用的css和js单独打包成一个vendors.css和vendors.js
new webpack.optimize.CommonsChunkPlugin({ 
    name:'vendors',
    filename:'static/js/[id].[name].[hash].js',
    minChunks: function () {  return true }
})

minChunks:num 表示require了num此才放在CommonChunk里边

再次执行npm run build会生成一下目录

Paste_Image.png

会发现app.vue里边的css被打包到了vendor.css中了,app.vue里的js和vue/vue-router被打包到了vendor.js中。

这样就基本完成了懒加载。

但是还没有实现如何将css安装vue文件打包成单独的文件,请大神多多指教!

备忘:生命周期(参考

Paste_Image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容