改造 vue-cli 脚手架

注意,这里使用的 vue-cli 的版本为 2.8.2,不同版本的 vue-cli 可能会有些许不一样。

一、配置多页面

项目开发目录:

需要注意一点,每个页面的文件夹命名、文件夹里面的入口 js 文件名及 hmtl 模板文件名应该一致,这样就可以使用一个函数来自动配置入口文件,而不必手动配置

project/
├──build/
├──config/
├──node_modules/
├──src/
│ ├──assets/
│ ├──components/
│ ├──html/
│ │ ├──pageOne/
│ │ │ ├──components/
│ │ │ ├──route/ // 如果有使用 vue-route
│ │ │ ├──store/ // 如果有使用 vueX
│ │ │ ├──style/
│ │ │ ├──APP.vue
│ │ │ ├──pageOne.html
│ │ │ ├──pageOne.js
│ │ ├──pageTwo/
│ │ │ ├──components/
│ │ │ ├──route/
│ │ │ ├──store/
│ │ │ ├──style/
│ │ │ ├──APP.vue
│ │ │ ├──pageTwo.html
│ │ │ ├──pageTwo.js
│ ├──utils/
├──static/
├──babelrcc
├──.editorconfig
├──.gitgnore
├──package.json
├──README.md

项目打包目录

dist
├──html/
│ ├──pageOne.html
│ ├──pageTwo.html
├──static/
│ ├──img/
│ ├──fonts/
│ ├──css/
│ │ ├──html/
│ │ │ ├──pageOne.css
│ │ │ ├──pageTwo.css
│ │ ├──other.css
│ ├──js/
│ │ ├──html/
│ │ │ ├──pageOne.js
│ │ │ ├──pageTwo.js
│ │ ├──manifest.js
│ │ ├──vendor.js
├──favicon.ico

1. 添加入口工具函数

// build/utils.js

var glob = require('glob');

exports.getEntries = function (globPath) {
var entries = {}
/**
* 读取src目录,并进行路径裁剪
*/
glob.sync(globPath).forEach(function (entry) {
/**
* path.basename 提取出用 ‘/' 隔开的path的最后一部分,除第一个参数外其余是需要过滤的字符串
* path.extname 获取文件后缀
*/
var basename = path.basename(entry, path.extname(entry)) // 过滤router.js
// ***************begin***************
// 当然, 你也可以加上模块名称, 即输出如下: { module/main: './src/module/index/main.js', module/test: './src/module/test/test.js' }
// 最终编译输出的文件也在module目录下, 访问路径需要时 localhost:8080/module/index.html
// slice 从已有的数组中返回选定的元素, -3 倒序选择,即选择最后三个
var tmp = entry.split('/').splice(-3)
if(basename!==tmp[1]) return; //过滤其他js文件
var pathname = tmp.splice(0, 1) + '/' + basename; // splice(0, 1)取tmp数组中第一个元素
entries[pathname] = ['babel-polyfill',entry]
});
return entries;
} /* 变量值
entry: ../src/html/index/index.js
basename: index
tmp: [ 'html', 'index', 'index.js' ]
pathname: html/index
enteries: {
'html/index': '../src/html/index/index.js',
'html/first': '../src/html/first/first.js'
}
*/

2. 修改入口配置

// bulid/webpack.base.conf.js

module.exports = {
entry: utils.getEntries('./src/html/*/*.js'),
...
}

3. 修改 HtmlWebpackPlugin 配置

// bulid/webpack.dev.conf.js

# 1. 引入工具函数
var utils = require('./utils') # 2. 注释掉原来的 HtmlWebpackPlugin 配置,大概在 29 行 # 3. 在文件末尾加入下面代码
var pages = utils.getEntries('./src/html/*/*.html');
for (var pathname in pages) {
// 配置生成的html文件,定义路径等
var conf = {
favicon: "favicon.ico",
filename: pathname + '.html',
template: pages[pathname][1], // 模板路径
inject: true, // js插入位置
excludeChunks: Object.keys(pages).filter(item => {
return (item != pathname)
})
};
module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}
// bulid/webpack.prod.conf.js

// 1. 注释掉原来的 HtmlWebpackPlugin 配置,大概在 52 行
// 2. 在文件末尾加入下面代码 var pages = utils.getEntries('./src/html/**/*.html'); for (var pathname in pages) {
// 配置生成的html文件,定义路径等
var conf = {
favicon: "favicon.ico",
filename: pathname + '.html',
template: pages[pathname][1], // 模板路径
inject: true, // js插入位置
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency',
};
if (pathname in module.exports.entry) { //为页面导入所需的依赖
conf.chunks = ['vendor','manifest', pathname];
conf.hash = false;
}
module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

4. 修改默认打开路径

// bulid/dev-server.js

var uri = 'http://localhost:' + port + '/' + Object.getOwnPropertyNames(utils.getEntries('./src/html/*/*.html'))[0] + '.html'

5. 修改打包路径为相对路径

// config/index.js

bulid: {
assetsPublicPath: '../',
}

6. 修改打包后 css 文件中对 图片和字库文件引用路径出错的的问题

// build/utils

// 38行
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
publicPath: '../../../', // 修改这里
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}

7. 检测浏览器版本

<!-- 在模板 html 中引入 -->

<script>
if (!+"\v1") {
document.body.innerHTML = "<div style='background: #00a1d6; text-align: center; padding: 10px 0; color: #fff;'>为了保护你的账号安全,Anywork已不支持IE8及以下版本浏览器访问,建议你升级到IE最新版本浏览器,或使用Chrome等其他浏览器。</div>"
}
</script>

二、配置跨域代理

1. 定义接口工具函数,使用 axios 规定访问路径

// src/utils/interaction.js

import axios from 'axios'

export const IP = '/anywork/';
export const myAxios = axios.create({
baseURL: IP,
// withCredentials: true
})

2. 添加跨域配置

// config/index.js

module.exports = {
dev: {
proxyTable: {
'/anywork': {
target: 'http://10.21.48.11:8080',
changeOrigin: true,
pathRewrite: {
'^/anywork': '/anywork'
}
}
},
}

三、配置常用 loader 和 依赖项

1. 引入 less

npm 下载

$ cnpm install less less-loader --save-dev

webpack.base.conf.js 配置

// 在 rules 中引入 loader

{
test: /\.less$/,
include: [
path.resolve(__dirname, "not_exist_path")
],
loader: 'style-loader!css-loader!less-loader'
},

2. 引入 stylus

npm install stylus stylus-loader --save-dev
<style scoped lang="stylus">
</style>

3. 引入 babel-polyfill

使 IE9 能使用一些 ES6 的新特性

先引入垫片

npm install bable-ployfill --save

方式一:通过 import 引入

// 入口文件
import 'babel-polyfill'

方式二:通过webpack 入口引入

// webpack.conf.js

module.exports = {
entry: ['babel-polyfill', entry-file-URL]
}

4. 引入其他

npm install axios --save
npm install iview --save // UI库
npm install vuex --save

注意

转载、引用,但请标明作者和原文地址

改造 vue-cli 脚手架的更多相关文章

  1. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...

  2. 使用Vue CLI脚手架搭建vue项目

    本次是使用@vue/cli 3.11.0版本搭建的vue项目 1. 首先确保自己的电脑上的Node.js的版本是8.9版本或者以上 2. 全局安装vue/cli npm install @vue/cl ...

  3. 改造@vue/cli项目为服务端渲染-ServerSideRender

    VUE SEO方案二 - SSR服务端渲染 在上一章中,我们分享了预渲染的方案来解决SEO问题,个人还是很中意此方案的,既简单又能解决大部分问题.但是也有着一定的缺陷,所以我们继续来看下一个方案--服 ...

  4. vue.cli脚手架初次使用图文教程

    vue-cli作用 vue-cli作为vue的脚手架,可以帮助我们在实际开发中自动生成vue.js的模板工程. vue-cli使用 !!前提:需要vue和webpack 安装全局vue-cli npm ...

  5. vue cli脚手架使用

    1.安装nodejs,npm https://www.cnblogs.com/xidianzxm/p/12036880.html 2.安装vue cli sudo npm install -g @vu ...

  6. node.js和vue cli脚手架下载安装配置方法

    一.node.js安装以及环境配置 1.下载vue.js 下载地址: https://nodejs.org/en/ 2.安装node.js 下载完成后,双击安装包开始安装.安装地址最好换成自己指定的地 ...

  7. vue cli 脚手架上多页面开发 支持webpack2.x

    A yuri demo for webpack2 vue multiple page.我看到有一些项目多页面项目是基于webapck1.0的,我这个是在webpack2.x上布置修改.  项目地址:  ...

  8. 用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)

    1.配置 Node 环境. 自行百度吧. 安装好了之后,打开 cmd .运行 node -v .显示版本号,就是安装成功了. 注:不要安装8.0.0以上的版本,和 vue-cli 不兼容. 我使用的 ...

  9. vue.js---利用vue cli脚手架工具+webpack创建项目遇到的坑

    1.Eslint js代码规范报错 WARNING Compiled with 2 warnings 10:43:26 ✘ http://eslint.org/docs/rules/quotes St ...

  10. vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。

    废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.e ...

随机推荐

  1. C#实现航班查询及预订

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. DOM备忘录

    nodeName和nodeValue属性 对于element节点而言,nodeName是标签名,nodeValue是null:而对于textNode节点而言,nodeName是#Text,nodeVl ...

  3. iOS 使用NTP时间同步服务

    githup上有相关开源库, ios-ntp 导入即可使用 NetworkClock *netClock = [NetworkClock sharedNetworkClock]; netClock.n ...

  4. PHP die与exit的区别

    最近听见有人说die和exit区别,bula~bula.决心一探究竟. 翻了翻PHP 5.6的源码(源码的位置为zend目录下zend_language_scanner.l大约是1014~1020行) ...

  5. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  6. linux下安装jdk,tomcat以及mysql

    环境:centOS6.8.jdk1.8,tomcat-8.5.15,mysql-5.7.18 1.  安装JDK 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看 ...

  7. Redis常见七种使用场景(PHP实战)

    edis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本篇文章,主要介绍利用Redis常见应用场景下PHP实战. ...

  8. ASP.NET Core的身份认证框架IdentityServer4--(4)添加第三方快捷登录

    添加对外部认证的支持 接下来我们将添加对外部认证的支持.这非常简单,因为你真正需要的是一个兼容ASP.NET Core的认证处理程序. ASP.NET Core本身也支持Google,Facebook ...

  9. 输入docker ps 报错信息处理Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied.

    完整错误信息 Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permis ...

  10. 基于JDK1.8的LinkedList剖析

    之前写了一篇ArrayList,那么今天就写一篇他的姊妹篇,LinkedList. 众所周知,ArrayList底层数据是数组,可以在O(1)的时间内get到数据,但删除和插入就要O(n)时间复杂度. ...