目前 vue-cli3 生成的配置是做单页面的,然而,我们有时也会有多页面的需求 。比如我们最常见的一个项目跑多个独立的小型的H5页面,这些页面不可能每一次都开一个新项目.但是在实际的项目中,我们需要这样的脚手架,参考了很多大牛的脚手架,这里提供了一种我的单页面脚手架转换为多页面脚手架的方案,供大家参考。
使用vue-cli生成一个你需要的单页面项目脚手架,然后我们就可以为所欲为了,目录我就不说明了,默认大家都知道。
每一次新开的页面都在pages里面起一个文件夹,文件夹名字就是H5页面名字,入口文件是文件夹的index.html和index.js。
修改vue.config.js
let path = require('path')
let glob = require('glob')
let mock = require('./src/mock/index.json');
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
//配置pages多页面获取当前文件夹下的html和js
function getEntry(globPath) {
let entries = {};
glob.sync(globPath).forEach(function(entry) {
var tmp = entry.split('/').splice(-3);
entries[tmp[1]] = {
entry: 'src/' + tmp[0] + '/' + tmp[1] + '/' + 'index.js',
template: 'src/' + tmp[0] + '/' + tmp[1] + '/' + 'index.html',
filename: tmp[1]
};
});
return entries;
}
let pages = getEntry('./src/pages/**?/*.html');
module.exports = {
lintOnSave: false,
baseUrl: process.env.NODE_ENV === "production" ? 'https://www.baidu.com/' : '/',
productionSourceMap: false,
pages,
devServer: {
index: '/',
open: process.platform === 'darwin',
host: '',
port: 9527,
https: false,
hotOnly: false,
proxy: {
'/xrf/': {
target: 'http://reg.tool.hexun.com/',
changeOrigin: true,
pathRewrite: {
'^/xrf': ''
}
},
}, // 设置代理
before: app => {
app.get('/', (req, res, next) => {
for(let i in pages){
res.write(`/${i}`);
}
res.end()
});
app.get('/goods/list', (req, res, next) => { //mock数据
res.status(299).json(mock)
})
}
},
chainWebpack: config => {
config.module
.rule('images')
.use('url-loader')
.loader('url-loader')
.tap(options => {
// 修改它的选项...
options.limit = 100
return options
})
Object.keys(pages).forEach(entryName => {
config.plugins.delete(`prefetch-${entryName}`);
});
if(process.env.NODE_ENV === "production") {
config.plugin("extract-css").tap(() => [{
path: path.join(__dirname, "./dist"),
filename: "css/[name].[contenthash:8].css"
}]);
}
},
configureWebpack: config => {
// if(process.env.NODE_ENV === "production") {
// config.output = {
// path: path.join(__dirname, "./dist"),
// filename: "js/[name].[contenthash:8].js"
// };
// }
}
}
复制代码
启动项目,显示项目所有H5连接
最主要的是修改:
before第一个参数express实例。
before: app => {
app.get('/', (req, res, next) => {
for(let i in pages){ //遍历项目链接
res.write(`/${i}`);
}
res.end()
});
app.get('/goods/list', (req, res, next) => { //mock数据
res.status(299).json(mock)
})
}
复制代码
行了,不说了,这几天北京太冷了,打字都不利索,暂且到此为止吧!
★ Nuxt.js 全面配置
目录
大家改一下看下自己package.json中的,即可。"browserslist": [
"> 1%",
"last 2 versions",
"last 10 Chrome versions",
"last 5 Firefox versions",
"Safari >= 6",
"ie > 8"
]
复制代码
browserList: [
"last 20 Chrome versions",
"last 20 Firefox versions",
"last 20 Opera versions",
"Explorer >= 11",
"Safari >= 8",
"Android >= 4.4",
"iOS >= 8"
],
复制代码
通过在 package.json 里的 scripts 配置项中添加--mode xxx 来选择不同环境
在项目根目录中新建.env, .env.production, .env.analyz 等文件
只有以 VUE_APP 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,代码中可以通过 process.env.VUE_APP_BASE_API 访问
NODE_ENV 和 BASE_URL 是两个特殊变量,在代码中始终可用
.env serve 默认的环境变量
NODE_ENV = 'development'
VUE_APP_BASE_API = 'https://demo.cn/api'
复制代码
.env.production build 默认的环境变量
如果开启 ali oss,VUE_APP_SRC 配置为 ali oss 资源 url 前缀,如:'staven.oss-cn-hangzhou.aliyuncs.com/demo'
NODE_ENV = 'production'
VUE_APP_BASE_API = 'https://demo.com/api'
VUE_APP_SRC = '/'
ACCESS_KEY_ID = ''
ACCESS_KEY_SECRET = ''
REGION = 'oss-cn-hangzhou'
BUCKET = 'staven'
PREFIX = 'demo'
复制代码
.env.analyz 用于 webpack-bundle-analyzer 打包分析
如果开启 ali oss,VUE_APP_SRC 配置为 ali oss 资源 url 前缀,如:'staven.oss-cn-hangzhou.aliyuncs.com/demo'
NODE_ENV = 'production'
IS_ANALYZ = 'analyz'
VUE_APP_BASE_API = 'https://demo.com/api'
VUE_APP_SRC = '/'
ACCESS_KEY_ID = ''
ACCESS_KEY_SECRET = ''
REGION = 'oss-cn-hangzhou'
BUCKET = 'staven'
PREFIX = 'demo'
复制代码
修改 package.json
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"analyz": "vue-cli-service build --mode analyz",
"lint": "vue-cli-service lint"
}
复制代码
▲ 回顶部
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
module.exports = {
baseUrl: './', // 默认'/',部署应用包时的基本 URL
outputDir: process.env.outputDir || 'dist', // 'dist', 生产环境构建文件的目录
assetsDir: '', // 相对于outputDir的静态资源(js、css、img、fonts)目录
lintOnSave: false,
runtimeCompiler: true, // 是否使用包含运行时编译器的 Vue 构建版本
productionSourceMap: false, // 生产环境的 source map
parallel: require('os').cpus().length > 1,
pwa: {}
};
复制代码
▲ 回顶部
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
module.exports = {
devServer: {
// overlay: {
// warnings: true,
// errors: true
// },
open: IS_PROD,
host: '0.0.0.0',
port: 8000,
https: false,
hotOnly: false,
proxy: {
'/api': {
target: process.env.VUE_APP_BASE_API || 'http://127.0.0.1:8080',
changeOrigin: true
}
}
}
}
复制代码
▲ 回顶部
module.exports = {
chainWebpack: config => {
// 修复HMR
config.resolve.symlinks(true);
}
}
复制代码
▲ 回顶部
module.exports = {
chainWebpack: config => {
config.plugin('html').tap(args => {
args[0].chunksSortMode = 'none';
return args;
});
}
}
复制代码
▲ 回顶部
const path = require('path');
const resolve = (dir) => path.join(__dirname, dir);
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
module.exports = {
chainWebpack: config => {
// 添加别名
config.resolve.alias
.set('@', resolve('src'))
.set('assets', resolve('src/assets'))
.set('components', resolve('src/components'))
.set('layout', resolve('src/layout'))
.set('base', resolve('src/base'))
.set('static', resolve('src/static'));
}
}
复制代码
▲ 回顶部
npm i -D image-webpack-loader
复制代码
module.exports = {
chainWebpack: config => {
config.module
.rule("images")
.use("image-webpack-loader")
.loader("image-webpack-loader")
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: "65-90", speed: 4 },
gifsicle: { interlaced: false },
webp: { quality: 75 }
});
}
}
复制代码
▲ 回顶部
npm i -D postcss-import @fullhuman/postcss-purgecss
复制代码
更新 postcss.config.js
const autoprefixer = require("autoprefixer");
const postcssImport = require("postcss-import");
const purgecss = require("@fullhuman/postcss-purgecss");
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV);
let plugins = [];
if (IS_PROD) {
plugins.push(postcssImport);
plugins.push(
purgecss({
content: ["./src/**/*.vue"],
extractors: [
{
extractor: class Extractor {
static extract(content) {
const validSection = content.replace(
/