vue项目构建过程
# template 模版项目 > A Vue.js project
* 构建过程
* 安装过程
* 差异点
* 打包优化 ## 构建过程
```bash
bogon:vue-cli caoke$ vue init webpack template ? Project name template
? Project description A Vue.js project
? Author caoke <caoke@caoke.com>
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm vue-cli · Generated "template". # Installing project dependencies ...
# ========================
``` ## 1、安装过程 ``` bash
# 安装依赖
npm install # 启动热服务 localhost:8080
npm run dev # 压缩打包
npm run build # 压缩打包 and 查看打包分析图
npm run build --report # 打包成测试环境
"deployTest": "cross-env assetsPublicPath=//zx.test.17zuoye.net/ node build/build.js", # 打包成线上环境
"deployOnline": "cross-env assetsPublicPath=//www.17zuoye.com/ node build/build.js", ```
### 2、差异点
2-1:新建目录
```
/src/api 服务接口口请求
/src/assets png、js、css资源存放
/src/common 公用资源
/src/components 项目内部组件
/src/directive vue指令
/src/entry 入口js
/src/marvel 第三份公用组件库
/src/models 数据模型
/src/router 路由
/src/utils 公用工具
/src/views 页面 ```
2-2:package.json
```
"axios": "^0.18.0",
"element-ui": "^2.3.8",
"glob": "^7.1.2",
"less": "^3.0.2",
"less-loader": "^4.1.0",
"node-sass": "^4.9.0",
"photoswipe": "^4.1.2",
"qs": "^6.5.2",
"sass-loader": "^7.0.1",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"text-loader": "^0.0.1",
"vue-markdown": "^2.2.4",
``` 2-3:webpack.prod.conf.js 自动配置entry,看打包优化部分
```
const test = require('./better'); const entry=test.getproEntry()
const htmlConfig=test.getproHtmlWebpack();
const commonsConfig=test.getCommonsChunk(); entry: entry, chunkFilename: utils.assetsPath('js/[name].[chunkhash].js') ...htmlConfig,
...commonsConfig, // new webpack.optimize.CommonsChunkPlugin({
// name: 'vendor',
// minChunks (module) {
// // any required modules inside node_modules are extracted to vendor
// return (
// module.resource &&
// /\.js$/.test(module.resource) &&
// module.resource.indexOf(
// path.join(__dirname, '../node_modules')
// ) === 0
// )
// }
// }), // new webpack.optimize.CommonsChunkPlugin({
// name: 'manifest',
// minChunks: Infinity
// }), ```
2-4:webpack.dev.conf.js 自动配置entry
```
const test = require('./better'); const entry=test.getdevEntry() const htmlConfig=test.getdevHtmlWebpack(); entry: entry, ...htmlConfig, ```
2-4:vue-loader.conf.js
```
esModule: false
``` 2-5:config/index.js
```
const productName = require('../package').name||'template';
dev: { // Paths
assetsSubDirectory: productName,
assetsPublicPath: '/',
proxyTable: {
/*
域名:https://www.easy-mock.com/
用户名:caoke
密码:123456
* */
'/api': {
target: 'https://www.easy-mock.com/', // 接口的域名
secure: false, // 如果是https接口,需要配置这个参数
changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
pathRewrite: {
'/api': '/mock/596f19b1a1d30433d837ad7d/example'
}
} }, build: {
// Template for index.html
index: path.resolve(__dirname, '../../dist/'+productName+'/index.html'), // Paths
assetsRoot: path.resolve(__dirname, '../../dist'),
assetsSubDirectory: productName,
assetsPublicPath: '/', productionSourceMap: false, ``` ## 3、自动配置和打包优化
* 3-1:根据entry目录,自动配置入口和html,以dev开头的文件不会发布到生产环境.
* 3-2:以公共文件名开头的文件,回生产公共文件。如a.demo.js、b.demo.js生产公共文件a.js。
* 3-3:子目录也遵循上述规范,也会生产对应的html、js、公共文件
* 3-3:在better.js手动配置公共的js,格式如下
```
const commonConfig={
'demo':['demo1','demo2'],//demo1、demo2的公共demo.js
// 'vendor':true,//所有页面的公共demo.js
}
``` build/better.js ```
//打包优化配置
const glob = require('glob');
const path = require('path');
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const productName = require('../package').name||'template';
/*
* a.demo1.js、a.demo2.js
* 表示存在公共的a.js,
* 会生产 a.[md5].js a.demo1.[md5].js a.demo2.[md5].js 3个文件
*
* */
//公共模块的配置
const commonConfig=getcommons(); function getcommons(){
const obj=getproEntry();
const commonCache={}
const commonConfig={}
for(let ke in obj){
ke.replace(/([a-z]+)\./i,function (m,p1) {
if(!commonCache[p1]){commonCache[p1]=[];}
commonCache[p1].push(ke)
if(commonCache[p1].length==2){
commonConfig[p1]=commonCache[p1]
}
})
} return commonConfig;
}
function getCommonsChunk() {
const data=[]
for(let name in commonConfig){
if(Array.isArray(commonConfig[name])){
data.push(
new webpack.optimize.CommonsChunkPlugin({
name: name,
minChunks:2,
chunks:commonConfig[name]
}))
}
}
return data;
} function getCommonBy(cname) {
const commons=[]
for(let name in commonConfig){
if(commonConfig[name].length>0&&commonConfig[name].indexOf(cname)>-1){
commons.push(name)
}
}
return commons;
}
/*
获取入口entry的所有js文件
*/
function getdevEntry() {
const arr = glob.sync(__dirname+'/../src/entry/**/*.js') const entry={}
arr.forEach(function (file) {
file.replace(/entry\/(.+)\.js$/,function (m,p1) {
entry[p1]=file
})
})
return entry;
}
//获取生产环境入口配置
function getproEntry() {
const arr = glob.sync(__dirname+'/../src/entry/**/!(dev.)*.js') const entry={}
arr.forEach(function (file) {
file.replace(/entry\/(.+)\.js$/,function (m,p1) {
entry[p1]=file
})
}) return entry;
} /*
生产html配置
*/
function getdevHtmlWebpack() {
const entry=getdevEntry();
const htmlConfig=[]
for(let name in entry){
htmlConfig.push(new HtmlWebpackPlugin({
title:name,
filename: productName+'/'+name+'.html',
template: 'index.html',
inject: true,
chunks:[name],
chunksSortMode: 'dependency'
}))
}
return htmlConfig;
}
function getproHtmlWebpack() {
const entry=getproEntry();
const htmlConfig=[] for(let name in entry){
const cmchunks=getCommonBy(name);
htmlConfig.push(new HtmlWebpackPlugin({
title:name,
filename: path.resolve(__dirname, '../../dist/'+productName+'/'+name+'.html'),
template: 'index.html',
inject: true,
minify: {
removeComments: true,
// collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
chunks:[...cmchunks,name],
chunksSortMode: 'manual'
}))
}
return htmlConfig;
}
module.exports={
getdevEntry,//自动配置开发环境入口
getproEntry,//自动配置生产环境入口
getdevHtmlWebpack,//自动配置开发环境html
getproHtmlWebpack,//自动配置生产环境入口
getCommonsChunk,//自动配置生产环境公共资源
}; ``` ## 4、入口模板
```
//引入公共配置
import Vue from '../common/pcbase';
/*
2、注册 组件容器
展示组件的容器
* */
Vue.component('card', require('../components/card.vue')); //1、导入elm ui
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI, { size: 'small' }); //项目的入口
import App from '../views/demo2' /* eslint-disable no-new */
new Vue({
el: '#app',
components: { App },
template: ' <div><mv-modal></mv-modal><App/></div>'
}) ```
## 5、打包构建速度优化
使用多线程压缩打包插件 webpack-parallel-uglify-plugin
```
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin') new AssetsPlugin({
prettyPrint:true,
fullpath:true
}),
new ParallelUglifyPlugin({
cacheDir: '.cache/',
uglifyJS:{
output: {
comments: false
},
compress: {
warnings: false
}
}
}),
```
## 6、本地mock
原理:路由的rewrite,以及代理插件
1、是否以http开头,用代理转发到url
2、以"/"开头,则在本地目录查找,是否存在该文件,返回该文件的json数据
3、不存在就做路由转发
```
module.exports=[
{ //本地的url =》 本地的url
// "/":"/mteacher/tcbag.html",
},{
//线上的url =》 本地的mock
"/ok":"/ok",
}
] ```
vue项目构建过程的更多相关文章
- vue项目构建与实战
关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 由于vue相对来说比较平缓的学习过程和新颖的技术思路,使其受到了广大前后端开发者的青睐,同时其通俗易 ...
- (转)Maven学习总结(二)——Maven项目构建过程练习
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...
- Maven学习总结(2)——Maven项目构建过程练习
Maven学习总结(二)--Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建 ...
- 通过调试vue-cli 构建代码学习vue项目构建运行过程
我们知道vue-cli 3.0之前直接基于webpack创建对应配置文件,我们通过学习webpack就能够了解其构建过程,然而从vue-cli 3.0开始,vue-cli命令行更改为@vue/cli以 ...
- 利用vue-cli3快速搭建vue项目详细过程
一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue ...
- Maven学习总结(二)——Maven项目构建过程练习
上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...
- Maven学习总结(二)——Maven项目构建过程练习_转载
上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...
- 转】Maven学习总结(二)——Maven项目构建过程练习
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4051690.html 感谢! 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven ...
- Maven学习(二)-- Maven项目构建过程练习
摘自:http://www.cnblogs.com/xdp-gacl/p/4051690.html 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约 ...
随机推荐
- zlib编程
一.简介 zlib是提供数据压缩用的函式库,使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用,今天,zlib是一种事实上的业界标准. 二.基本信息 数据头(hea ...
- 权限管理RBAC
四张表: 1.module:id/name //模块 2.action:id /module_id/name //权限 3.user:id/name //用户表 4.group:id/user_id ...
- Python3 网络爬虫开发实战学习弱点书签
1. urllib.robotparse模块对robot.txt文件的解析,can_fetch()方法和parse()方法. Page121 2. lxml.etree模块自动补全Html代码,Htm ...
- hadoop2.2分布式环境搭建
hadoop2.2的分布式环境需要配置的参数更多.但是需要安装的系统软件和单节点环境是一样的. 运行hadoop在非安全环境 hadoop的配置文件有两类: 1:只读的默认配置文件: core-def ...
- 验证码测试-demo
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...
- Java 线程不安全问题分析
当多个线程并发访问同一个资源对象时,可能会出现线程不安全的问题 public class Method implements Runnable { private static int num=50; ...
- linq to sql 实现左(右)连接,那个方法是对的,该怎么处理
linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0 join tb1 in db.table_1 on table_0.关 ...
- Mongo Windows 基本使用入门
1.安装https://www.mongodb.com/download-center#community注意:安装 "install mongoDB compass" 不勾选下载 ...
- 我的java问题排查工具单
前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常 ...
- kali linux之手动漏洞挖掘二
漏洞挖掘原则/宗旨----所有变量,所有头(cookie中的变量),逐个变量删除 身份认证 常用若口令/基于字典的密码爆破/锁定帐号 信息收集(手机号,身份证,住址信息等等) 密码嗅探 会话sessi ...