Vuejs2 + Webpack框架里,模拟下载的实例讲解


Posted in Javascript onSeptember 05, 2018

在实际的开发工作中,难免要配合销售人员,提前做一些前端的 DEMO 出来。这个时候往往还没有连接后端 API。假如要演示一个下载连接,那么应该如何做呢?

我们希望能够达成以下两点:

1、在开发环境下,我们可以在 webpack-dev-server 开发服务器上点击下载连接,点击后浏览器就能不下载文件。

2、当演示的时候,代码编译后放到 nginx 中。用户可以点击下载链接。nginx存放的都是业务代码。

那么如何做到这两点呢?假如我们要模拟下载一个 test.docx 文件。我们可以利用 url-loader 来对 .docx 文件做处理。可能有人会问:“url-loader 一般不是处理 img 标签里面的图片文件路径吗?”为了解决这个 img 标签的问题,我们可以在一个页面中加上隐藏的图片标签。最后加一个 a 标签: <a href="/test.docx" rel="external nofollow" rel="external nofollow" >下载</a>。下面的篇幅要帮助读者搭建一个简单的项目,来演示这种方法。

* 演示项目 *

项目名称是blog02,项目目录结构如下:

blog02
 │
 ├─src
 │ ├─App.vue
 │ ├─home.vue
 │ ├─main.js
 │ ├─test.docx
 │ └─router.js
 │
 ├─.babelrc
 ├─index.template.html
 ├─package.json
 └─webpack.config.js

App.vue

<template>
 <div>
 <router-view></router-view>
 </div>
</template>
<script>
export default {
}
</script>

home.vue

<template>
 <div class="home-wrapper">
  <span class="my-style">这里是首页</span>
  <!-- 下载链接 -->
  <a href="/test.docx" rel="external nofollow" rel="external nofollow" >下载</a>

  <!-- 触发 url-loader,使得 url-loader 处理 word 文档。 -->
  <img v-show="isShow" src="./test.docx"/>
 </div>
</template>
<script>
export default {
 data(){
  // 隐藏包含 word 文档路径的 img 标签。
  return {isShow:false};
 }
};
</script>
<style lang="scss" rel="stylesheet/scss" scoped>
.home-wrapper{
 .my-style{
  width:900px;
  height:600px;
  float:right;margin-right:200px;
  padding-top:100px;
  color:#FF0000;
 }
}

</style>

main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import routes from './router'
import VueSuperagent from 'vue-superagent'
import 'babel-polyfill';

Vue.use(VueRouter);
Vue.use(VueSuperagent);

const router = new VueRouter({
 mode: 'history',
 routes
})

new Vue({
 el: '#app',
 router,
 render: h => h(App)
})

router.js

import Home from './home.vue'

export default [{
 path:'/',
 component:Home
}]

.babelrc

{
 "presets": [
 ["latest", {
  "es2015": { "modules": false }
 }]
 ]
}

index.template.html

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="utf-8">
 <title>blog02</title>
 </head>
 <body>
 <div id="app">
  <router-view></router-view>
 </div>
 <!--<script src="/dist/[name].[chunkhash].js"></script>-->
 </body>
</html>

package.json

{
 "name": "blog02",
 "description": "CSDN blog02",
 "version": "1.0.0",
 "author": "",
 "private": true,
 "scripts": {
  "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
  "build": "rimraf dist && cross-env NODE_ENV=production webpack --progress --hide-modules"
 },
 "dependencies": {
  "babel-polyfill": "^6.23.0",
  "vue": "^2.2.1",
  "vue-router": "^2.3.0",
  "vue-superagent": "^1.2.0"
 },
 "devDependencies": {
  "babel-core": "^6.0.0",
  "babel-loader": "^6.0.0",
  "babel-preset-latest": "^6.0.0",
  "cross-env": "^3.0.0",
  "css-loader": "^0.25.0",
  "file-loader": "^0.9.0",
  "html-webpack-plugin": "^2.28.0",
  "node-sass": "^4.5.0",
  "rimraf": "^2.6.1",
  "sass-loader": "^5.0.1",
  "url-loader": "^0.5.8",
  "vue-loader": "^11.1.4",
  "vue-template-compiler": "^2.2.1",
  "webpack": "^2.2.0",
  "webpack-dev-server": "^2.2.0"
 }
}

webpack.config.js

var path = require('path')
var webpack = require('webpack')
const HTMLPlugin = require('html-webpack-plugin')

module.exports = {
 entry: {
  app: ['./src/main.js'],
  // 把共用的库放到vendor.js里
  vendor: [
   'babel-polyfill',
   'vue',
   'vue-router',
   'vuex'
  ]
 },
 output: {
 path: path.resolve(__dirname, './dist'),

 // 因为用到了 html-webpack-plugin 处理HTML文件。处理后的HTML文件都放到了
 // dist文件夹里。html文件里面js的相对路径应该从使用 html-webpack-plugin 前
 // 的'/dist/' 改成 '/'
 publicPath: '/',
 // publicPath: '/dist/',
 filename: '[name].[hash].js'
 // filename:'build.js'
 },
 module: {
 rules: [
  {
  test: /\.vue$/,
  loader: 'vue-loader',
  options: {
   loaders: {
   // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
   // the "scss" and "sass" values for the lang attribute to the right configs here.
   // other preprocessors should work out of the box, no loader config like this necessary.
   'scss': 'vue-style-loader!css-loader!sass-loader',
   'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
   }
   // other vue-loader options go here
  }
  },
  {
  test: /\.js$/,
  loader: 'babel-loader',
  exclude: /node_modules/
  },
  // font loader
  {
  test: /\.(ttf|eot|woff|svg)$/i,
  loader: 'url-loader'
  },
  // 图片处理
  {
  test: /\.(png|jpg|gif)$/,
  loader: 'url-loader',
  options: {
   limit: '1000',
   name: '[name].[ext]?[hash]'
  }
  },
  // 处理模拟下载文件
  {
  test: /\.(docx)$/,
  loader: 'url-loader',
  options: {
   limit: '10',
   name: '[name].[ext]'
  }
  }
  // {
  // test: /\.(png|jpg|gif|svg)$/,
  // loader: 'file-loader',
  // options: {
  //  name: '[name].[ext]?[hash]'
  // }
  // }
 ]
 },
 plugins:[
 // 把共用的库放到vendor.js里
 new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}),
 // 编译HTML。目的:在生产环境下,为了避免浏览器缓存,需要文件按照哈希值重命名。
 // 这里编译可以自动更改每次编译后引用的js名称。
 new HTMLPlugin({template: 'index.template.html'})
 ],
 resolve: {
 alias: {
  'vue$': 'vue/dist/vue.esm.js'
 }
 },
 devServer: {
 historyApiFallback: true,
 noInfo: true
 },
 performance: {
 hints: false
 },
 devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
 module.exports.devtool = '#source-map'
 // http://vue-loader.vuejs.org/en/workflow/production.html
 module.exports.plugins = (module.exports.plugins || []).concat([
 new webpack.DefinePlugin({
  'process.env': {
  NODE_ENV: '"production"'
  }
 }),
 new webpack.optimize.UglifyJsPlugin({
  sourceMap: true,
  compress: {
  warnings: false
  }
 }),
 new webpack.LoaderOptionsPlugin({
  minimize: true
 })
 ])
}

以上这篇Vuejs2 + Webpack框架里,模拟下载的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
List the Stored Procedures in a SQL Server database
Jun 20 Javascript
jQuery 打造动态渐变按钮 详细图文教程
Apr 25 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
jQuery+css实现图片滚动效果(附源码)
Mar 18 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
May 07 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
JS使用cookie实现只出现一次的广告代码效果
Apr 22 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
Jul 24 Javascript
vue 怎么创建组件及组件使用方法
Jul 27 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 Javascript
JS实现点击拉拽轮播图pc端移动端适配
Sep 05 #Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 #Javascript
解决vue点击控制单个样式的问题
Sep 05 #Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 #Javascript
vuejs点击class变化的实例
Sep 05 #Javascript
jQuery滑动效果实现方法分析
Sep 05 #jQuery
vue+springboot实现项目的CORS跨域请求
Sep 05 #Javascript
You might like
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
关于Python数据结构中字典的心得
2017/12/04 Python
Python实现学生成绩管理系统
2020/04/05 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Pytorch的mean和std调查实例
2020/01/02 Python
哪些是python中web开发框架
2020/06/17 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
大学生创业感言
2014/01/25 职场文书
给全校老师的建议书
2014/03/13 职场文书
师范毕业生求职信
2014/07/11 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书