大佬教程收集整理的这篇文章主要介绍了手把手教你vue-cli单页到多页应用的方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
673_0@
vue-cli到多页应用
@H_
673_0@
前言:我有一个cli创建的vue项目,但是我想做成多页应用,怎么办,废话不多说,直接开撸~
@H_
673_0@
约定:新增代码部分在//add和//end中间 删除(注释)代码部分在//del和//end中间,很多东西都写在注释里
@H_
673_0@
第一步:cli一个vue项目
@H_
673_0@新建
一个vue项目 官网 vue init webpack demo
@H_
673_0@cli
默认使用webpack的dev-server服务,这个服务是做不了单页的,需要手动建
一个私服叫啥你随意 一般叫dev.server或者dev.client
@H_
673_0@
第二步:添加两个方法处理出口入口文件(SPA默认写死的)
@H_
673_0@进入刚刚创建vue项目 cd demo
@H_
673_0@在目录下面找到build/util
s.js
文件
@H_
673_0@
修改部分:
@H_
673_0@util
s.js
@H_
673_0@//add
const glob =
require('glob'
);
const HtmlWebpackPlugin =
require('html-webpack-plugin'
); //功能:生成html文件及js文件并把js引入html
const pagePath = path.resolve(__dirname,'../src/views/'
); //页面的路径,比如这里我用的views,那么后面私服加入的文件监控器就会从src下面的views下面开始监控文件
//end
@H_
673_0@export
s.assetsPath = function (_path)
{
const assetsSubDirectory = proces
s.env.NODE_ENV === 'production'
? config
.build.assetsSubDirectory
: config.dev.assetsSubDirectory
@H_
673_0@return path.posix.join(assetsSubDirectory,_path)
}
@H_
673_0@export
s.cssLoaders = function (options)
{
options = options ||
{}
@H_
673_0@
const cssLoader =
{
loader: 'css-loader',options:
{
sourceMap: option
s.sourceMap
}
}
@H_
673_0@const postcssLoader =
{
loader: 'postcss-loader',options:
{
sourceMap: option
s.sourceMap
}
}
@H_
673_0@// generate loader
String to be used with extract text plugin
function generateLoaders (loader,loaderOptions)
{
const loaders = option
S.UsePostCSS ? [cssLoader,postcssLoader] : [cssLoader]
@H_
673_0@if (loader)
{
loader
s.push(
{
loader: loader + '-loader',options: Ob
ject.assign(
{},loaderOptions,
{
sourceMap: option
s.sourceMap
})
})
}
@H_
673_0@// Extract CSS when that option is specified
// (which is the case during production build)
if (option
s.extract)
{
return ExtractTextPlugin.extract(
{
use: loaders,
fall
BACk: 'vue-style-loader'
})
} else
{
return ['vue-style-loader'].concat(loaders)
}
}
@H_
673_0@//
https://vue-loader.vuejs.org/en/configurations/extract-css.html
return
{
css: generateLoaders(),postcss: generateLoaders(),less: generateLoaders('less'),sass: generateLoaders('sass',
{ indentedSyntax: true }),scss: generateLoaders('sass'),stylus: generateLoaders('stylus'),styl: generateLoaders('stylus')
}
}
@H_
673_0@// Generate loaders for standalone style files (outside of .vu
E)
export
s.styleLoaders = function (options)
{
const output = []
const loaders = export
s.cssLoaders(options)
@H_
673_0@for (const extension in loaders)
{
const loader = loaders[extension]
output.push(
{
test: new RegExp('\.' + extension + '$'),use: loader
})
}
@H_
673_0@return output
}
@H_
673_0@export
s.createNotifierCall
BACk = () =>
{
const notifier =
require('node-notifier')
@H_
673_0@return (severity,errors) =>
{
if (severity
!== 'error') return
@H_
673_0@const error = errors
[0]
const fil
ename = error.file && error.file.split('!').pop()
@H_
673_0@notifier.notify(
{
title: packageCon
fig.name,
message: severity + ': ' + error.name,sub
title: fil
ename || '',icon: path.join(__dirname,'
logo.png')
})
}
}
@H_
673_0@//add 新增
一个方法处理入口
文件(单页应用的入口都是写死,到时候替换成这个
方法)
export
s.createEntry = () =>
{
let files = glob.sync(pagePath + '/*
/.js'
);
let entries =
{};
let bas
ename;
let foldername;
@H_
673_0@file
s.forEach(entry =>
{
// Filter the router.js
bas
ename = path
.bas
ename(entry,path.extname(entry),'router.js'
);
foldername = path.dirname(entry).split('/').splice(-1)
[0];
@H_
673_0@// If foldername not equal bas
ename,doing nothing
// The folder maybe contain more js files,but only the same name is main
if (bas
ename === folder
Name) {
entries[bas
ename] = [
'webpack-hot-middleware/client?noInfo=true&reload=true&path=/__webpack_hmr&timeout=
20000',entry];
}
}
);
return entries;
};
//end
@H_
673_0@//add 新增出口
文件
export
s.createHtmlWebpackPlugin = () =>
{
let files = glob.sync(pagePath + '/*
/.html',
{matchBase: tru
E});
let entries = export
s.createEntry(
);
let plugins = [];
let conf;
let bas
ename;
let foldername;
@H_
673_0@file
s.forEach(file =>
{
bas
ename = path
.bas
ename(file,path.extname(fil
E));
foldername = path.dirname(fil
E).split('/').splice(-1).join(''
);
@H_
673_0@if (bas
ename === folder
Name) {
conf =
{
template: file,fil
ename: bas
ename + '.html',in
ject: true,chunks: entries[bas
ename] ? [bas
ename] : []
};
if (proces
s.env.NODE_ENV
!== 'development')
{
conf.chunksSortMode = 'dependency';
conf.minify =
{
removeComments: true,collapseWhitespace: true,removeAttributeQuotes: true
};
}
@H_
673_0@plugin
s.push(new HtmlWebpackPlugin(conf)
);
}
}
);
return plugins;
};
//end
大佬总结
以上是大佬教程为你收集整理的手把手教你vue-cli单页到多页应用的方法全部内容,希望文章能够帮你解决手把手教你vue-cli单页到多页应用的方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。