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 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
自己动手开发jQuery插件教程
Aug 25 Javascript
JS实现图片预加载无需等待
Dec 21 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
Jan 17 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
Mar 01 Javascript
jquery对dom的操作常用方法整理
Jun 25 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
Sep 25 Javascript
JavaScript多种图形实现代码实例
Jun 28 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 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
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
Vue路由跳转问题记录详解
2017/06/15 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python重新加载模块的实现方法
2018/10/16 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python队列Queue的详解
2019/05/10 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
python实现学生管理系统开发
2020/07/24 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
华为慧通笔试题
2016/04/22 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
学校办公室主任职责
2013/12/27 职场文书
2014年党支部承诺书
2014/05/30 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
地震慰问信
2015/02/14 职场文书
2015政治思想表现评语
2015/03/25 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
56句经典英文座右铭
2019/08/09 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL