Vue+thinkJs博客网站(一)之vue多页面应用的webpack3配置

news/2024/4/28 2:01:47/文章来源:https://blog.csdn.net/weixin_34249367/article/details/88612497

一.项目简介

    本项目使用vue作为前端框架,thinkJs作为后端框架,构建个人博客网站,页面分为博客展示和后台管理,主要目的是学习使用thinkJs。现在只完成了主要的博客增删改功能,发现webpack的配置遇到了一些坑,这里先记录下。项目目录结构如下:
图片描述

其中system文件夹是前端vue项目的代码,博客展示页面与后台管理页面都在这里,打包成两个页面,具体webpack配置是本文重点。项目地址在这

二.搭建过程

安装nodejs后,首先安装thinkjs

npm install -g think-cli;
thinkjs new self_blog;
npm install;
npm start;

这样thinkJs项目初步搭建完成了,接下来创建vue项目。项目根目录下新建文件夹system。

npm install -g vue-cli
vue init webpack self_blog
cd self_blog
npm install
npm run dev

这样vue项目初步搭建完毕,接下来讲下这里vue的具体webpack配置。

三.webpack配置

项目前端页面分为博客的展示和后台管理,这里的思路是将sytem的src下面放后台管理页面,在sytem下新建blog文件夹,放前台展示页面,打包时生成两个html,实现webpack打包多页面应用。目录如下:
图片描述

1.webpack.base.conf.js的配置

使用vue-cli创建项目,npm run dev运行开发环境,会使用webpack-dev-server作为前端服务器,从而实现热加载。这样打包的文件只会在内存里,这里我的思路是直接生成到thinkJs项目的view目录下,通过服务端的路由返回给前端。这样只用启动后端的服务就行了,因为文件已经打包到服务端,前端也不存在跨域访问后端的问题了。所以这里就不需要配置devServer了,而是改变html与js等静态资源的生成目录。首先看下webpack.base.conf.js的代码:

"use strict";
const path = require("path");
const utils = require("./utils");
const config = require("../config");
const vueLoaderConfig = require("./vue-loader.conf");
const webpack = require("webpack");
const baseFileName = require("../package.json").name;
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const cleanWebpackPlugin = require("clean-webpack-plugin");
const AssetsPlugin = require("assets-webpack-plugin");
function resolve(dir) {return path.join(__dirname, "..", dir);
}module.exports = {context: path.resolve(__dirname, "../"),entry: {app: "./src/main.js",blog: "./blog/index.js"},output: {path: config.build.assetsRoot,filename: "[name].js",publicPath:process.env.NODE_ENV === "production"? config.build.assetsPublicPath: config.dev.assetsPublicPath},resolve: {extensions: [".js", ".vue", ".json"],alias: {vue$: "vue/dist/vue.esm.js","@": resolve("src")}},externals: {vue: "Vue","vue-router": "VueRouter",echarts: "echarts",ElementUI: "element-ui"},module: {rules: [{test: /\.vue$/,loader: "vue-loader",options: vueLoaderConfig},{test: /\.js$/,loader: "babel-loader",include: [resolve("src"),resolve("test"),resolve("node_modules/webpack-dev-server/client")]},{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: "url-loader",exclude: [resolve("src/icons")],options: {limit: 10000,name: utils.assetsPath(baseFileName + "https://segmentfault.com/img/[name].[hash:7].[ext]")}},{test: /\.svg$/,loader: "svg-sprite-loader",include: [resolve("src")],options: {symbolId: "icon-[name]"}},{test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,loader: "url-loader",options: {limit: 10000,name: utils.assetsPath(baseFileName + "/media/[name].[hash:7].[ext]")}},{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,loader: "url-loader",options: {limit: 10000,name: utils.assetsPath(baseFileName + "/fonts/[name].[hash:7].[ext]")}}]},plugins: [new AssetsPlugin({filename: "build/webpack.assets.js",processOutput: function(assets) {return "window.WEBPACK_ASSETS=" + JSON.stringify(assets);}}),new webpack.optimize.CommonsChunkPlugin({name: "vendor",minChunks: function(module) {return (module.resource &&/\.js$/.test(module.resource) &&module.resource.indexOf(path.join(__dirname, "../node_modules")) === 0);}}),new webpack.optimize.CommonsChunkPlugin({name: "manifest",minChunks: Infinity}),new ExtractTextPlugin({filename: utils.assetsPath(baseFileName + "/css/[name].[contenthash].css"),allChunks: true}),// 编译前删除之前编译生成的静态资源new cleanWebpackPlugin(["www/static/self_blog", "view/blog"], {root: resolve("../")})],node: {setImmediate: false,dgram: "empty",fs: "empty",net: "empty",tls: "empty",child_process: "empty"}
};

首先需要改的是入口文件,因为是多页面应用,需要多个入口文件来保证打包成不同的chunk。我们知道正常vue-cli创建的但页面应用,会打包成三个chunk,分别是vendor.js(第三方依赖),manifest.js(异步加载的实现),app.js(业务代码)。这里新增一个入口文件,打包时就会生成名为blog.js的chunk,含有前台展示页面的js业务代码。

这里新增使用的clean-webpack-plugin,是为了每次编译后,删除之前生成的js,css等静态资源,否则因为这些资源不重名,就会一直堆在你生成的目录下。

此外一些第三方依赖,vue,elementUI什么的,我使用了cdn引入,这样打包时这些依赖不会打进去,进而减小的vendor.js的体积。具体做法就是配置里的externals定义这些依赖,然后在生成html的模板里用script标签直接引入cdn里的js。

注意一下,如果你开发时想用vue-devtool,需要引入vue.js,如果不用就引入vue.min.js。

2.webpack.dev.conf.js的配置

先看下代码:

"use strict";
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const path = require("path");
const baseWebpackConfig = require("./webpack.base.conf");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin");
const portfinder = require("portfinder");const HOST = process.env.HOST;
const PORT = process.env.PORT && Number(process.env.PORT);
const baseFileName = require("../package.json").name;
function resolve(dir) {return path.join(__dirname, "..", dir);
}
const devWebpackConfig = merge(baseWebpackConfig, {module: {rules: utils.styleLoaders({sourceMap: config.dev.cssSourceMap,extract: true,usePostCSS: true})},// cheap-module-eval-source-map is faster for developmentdevtool: config.dev.devtool,output: {path: resolve(config.dev.assetsRoot),filename: "static/" + baseFileName + "/js/[name]-[hash:5].js",chunkFilename: "static/" + baseFileName + "/js/[name]-[id:5].js"},plugins: [new webpack.DefinePlugin({"process.env": require("../config/dev.env")}),// new webpack.HotModuleReplacementPlugin(),new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.new webpack.NoEmitOnErrorsPlugin(),// https://github.com/ampedandwired/html-webpack-pluginnew HtmlWebpackPlugin({filename: resolve(`../view/blog/index_index.html`),template: "./view/index.html",title: "博客管理系统",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "app"]}),new HtmlWebpackPlugin({filename: resolve(`../view/blog/blog_index.html`),template: "./view/blog.html",title: "博客展示",inject: true,chunks: ["manifest", "vendor", "blog"]}),// copy custom static assetsnew CopyWebpackPlugin([{from: path.resolve(__dirname, "../static"),to: config.dev.assetsSubDirectory,ignore: [".*"]}])]
});
module.exports = devWebpackConfig;

这里我删掉了之前默认配置的devSever,以及module.exports直接导出devWebpackConfig。此外,因为打包生成目录的变化,我修改了output里面的path,filename,chunkFilename。使他们生成到self_blog根目录的www/static下面,这也是thinkJs静态资源的默认目录。需要注意下,filename指的是你的出口文件(app),以及通过codespliting生成的js(vendor,manifest)的文件名;chunkFilename定义的是一些懒加载组件打包后的js文件名。

下面需要添加的就是html-webpack-plugin,因为需要打包成两个html,所以使用两次这个插件。除了定义生成文件名(filename),html模板(template)等,还需要定义你这个html需要的chunk,这是跟单页面配置的一个区别。

除此之外,如果你想要开发环境打包时就分离出css,那么在使用utils.styleLoaders时,将extract置为true。因为这里的方法判断是开发环境才使用extract-text-plugin抽离css。

3.webpack.prod.conf.js的配置

prod的配置与dev差不多,生成文件目录也没变,只不过多了一些js,css压缩插件。

"use strict";
const path = require("path");
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const baseWebpackConfig = require("./webpack.base.conf");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const OptimizeCSSPlugin = require("optimize-css-assets-webpack-plugin");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const baseFileName = require("../package.json").name;
const env = require("../config/prod.env");
function resolve(dir) {return path.join(__dirname, "..", dir);
}
const webpackConfig = merge(baseWebpackConfig, {entry: {app: "./entry/entry-client-index",blog: "./entry/entry-client-blog"},module: {rules: utils.styleLoaders({sourceMap: config.build.productionSourceMap,extract: true,usePostCSS: true})},devtool: config.build.productionSourceMap ? config.build.devtool : false,output: {path: resolve(config.dev.assetsRoot),filename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js",chunkFilename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js"},plugins: [new webpack.DefinePlugin({"process.env": require("../config/prod.env"),"process.env.VUE_ENV": '"client"'}),new UglifyJsPlugin({uglifyOptions: {compress: {warnings: false}},sourceMap: config.build.productionSourceMap,parallel: true}),new webpack.optimize.OccurrenceOrderPlugin(),new webpack.LoaderOptionsPlugin({minimize: true}),// extract css into its own filenew ExtractTextPlugin({filename: utils.assetsPath(baseFileName + "/css/[name].[contenthash].css"),allChunks: true}),new HtmlWebpackPlugin({minify: {},chunksSortMode: "dependency",environment: process.env.NODE_ENV,filename: resolve(`../view/blog/index_index.html`),template: "./view/index.html",title: "博客管理系统",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "app"]}),new HtmlWebpackPlugin({filename: resolve(`../view/blog/blog_index.html`),template: "./view/blog.html",title: "博客展示",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "blog"]}),// Compress extracted CSS. We are using this plugin so that possible// duplicated CSS from different components can be deduped.new OptimizeCSSPlugin({cssProcessorOptions: config.build.productionSourceMap? { safe: true, map: { inline: false } }: { safe: true }}),]
});if (config.build.productionGzip) {const CompressionWebpackPlugin = require("compression-webpack-plugin");webpackConfig.plugins.push(new CompressionWebpackPlugin({asset: "[path].gz[query]",algorithm: "gzip",test: new RegExp("\\.(" + config.build.productionGzipExtensions.join("|") + ")$"),threshold: 10240,minRatio: 0.8}));
}if (config.build.bundleAnalyzerReport) {const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;webpackConfig.plugins.push(new BundleAnalyzerPlugin());
}module.exports = webpackConfig;

四.总结

具体可以看github上的代码

本次项目主要目的是练习thinkJs,这里先把前期webpack配置方面的东西简单说下,下一篇将会仔细讲下thinkJs的使用方法和特性。项目会继续更新,不少东西还没做完呢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_758230.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建网站必不可少的知识9

接下来我们利用刚才得到的FTP信息进行网站文件的上传。小编以前使用FlashFXP,后来管理的服务器多了,涉及Linux系统和win系统以及虚拟主机,就改用xshell,他没法登录WIN系统远程,但是另外两种登录都包含。现在打开xshell…

名信片定做网站

最近发现一个免费制作名信片做推广的的网站,share一下给我自己的博客长长人气 下面是我的博客链接哦!里面有具体的链接 http://www.gaoxiaxia.com/wordpress/?p108

建站步骤

建站步骤 https://cloud.tencent.com/developer/article/1524225 几点补充: 1)添加角色后,系统会自动创建一个默认的站点(即XXX_XXX_XXX_XXX\Administrater->Default Web Site,位于角色->Web服务器(IIS)->…

日系博客HTML网站设计,源码搭建,无插件无框架,含音乐播放器,时钟日历,轮播图,相册

引言 为课程作业,设计参考了无印良品日本官网 应老师要求不使用JQ,全部效果源码一行行敲出来,浏览器用的是360极速浏览器,未对其他浏览器内核进行适配,最终实现的效果如下,可进入展示页面查看 展示页面&am…

网站调用支付宝进行支付-Java后台调用支付宝支付

网站调用支付宝进行支付-Java后台调用支付宝支付 最近公司一个产品用到了打赏支付,其中一个是支付宝,记录一下java后台调用支付宝的过程付代码。本文讲的是使用沙箱环境(支付宝提供的一种开发专用模式,不要实际支付,可以走通整个流…

整理了一周的Python资料,包含各阶段所需网站、项目,收藏了慢慢来

为什么80%的码农都做不了架构师?>>> 这周应该有不少学校已经开学了,那么同学们都该动起来了,把家里面的那些懒习惯给扔掉了可以。 不知怎么的,最近不少关注我的读者都开始私信我怎么学好python?零基础转行…

HTML——body 计算机代码 【头部在“网站开发”中】

HTML属性 完整的属性列表 在引用属性值的时候,如果某些属性本身就有双引号——name John "ShotGun" Nelson 转载于:https://www.cnblogs.com/expedition/p/10889312.html

linux/centos svn搭建及网站同步更新

开发十年,就只剩下这套架构体系了! >>> 一 搭建篇 yum install -y subversion svnserve --version 二 创建项目仓库 mkdir /var/svn cd /var/svn svnadmin create /var/svn/[项目名] 三 配置项目仓库 cd /var/svn/[项目名]/conf 1.修改综合配…

[Windows] 【黑科技】在线视频一键下载器:无尽一键视频下载v0.2主流视频网站想下就下...

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> 前言 在线视频下载工具不算少,但真正好用的少之又少。很多软件步骤繁琐,下载速度慢,失效很快。我通过研究与写代码实现了真正一键就把视频下载下来。我的原…

[Android] 我的听书 谷歌版是一个帮助大家播放听书网站的播放器

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 注意事项: 如果锁屏不能自动切下一首,依次试一下: 1. 开启锁屏通知 2. 给app加锁 3. 前两者都不行时则去加后台白名单。 关于离线下载:不想给被抓取的网站增加负担…

国外停课后上百个教育网站官宣免费,亲测后发现这10个在国内秒打开!

随着海外疫情的爆发,世界各地的学校陆续开启了停课模式。为了方便学生们在家进行线上学习,各大教育网站也都纷纷推出了前所未有的阶段免费。这对一直以来给孩子苦苦寻求学习资源的老师和家长们来说,简直有了“一夜暴富”的赶脚。1. 教学资源网…

利用AirExplorerProPortable 实现网站 每日备份

Air Explorer Pro(v2.8.1)是一款非常出色的云存储资源管理工具,支持OneDrive、WebDAV和Google Drive等绝大多数云服务器,可以在将文件上传到云时对文件进行加密,同时还可在任何云或计算机之间同步文件夹。一个软件就可…

微软没强迫?Win 10 版本号追踪网站 Buildfeed 关闭

百度智能云 云生态狂欢季 热门云产品1折起>>> 近日,迫于各方压力,知名 Windows 10 版本号追踪网站 Buildfeed 宣布关闭。对于 Windows Insider 用户来说,即时获取最新 Windows 10 预览版本信息很重要,目前微软官方有提…

用apicloud 免费,简单封装一个wap手机网站成android app

APICloud是国内较早布局低代码开发的平台之一,其发布的低代码效率工具Plus Mode,为IT项目中每个角色提供专业工具,将需求分析、产品原型、UI设计、前端开发、后端开发紧密衔接,并基于行业大数据对前置环节进行复用,最终…

好域名怎么选?总结15名网站大佬给我的8条建议!(精华)

写网站上线的文章中提到需要有域名,本来是想在百度里搜一篇“选域名方面”的文章链接过去就好,但是看了好几篇,讲的都太笼统了,看完不知所云,一看就是“互相借鉴”的文章。所以我问了身边的几十位大佬,让他…

网站漏洞修复之苹果cms电影系统

2019独角兽企业重金招聘Python工程师标准>>> 苹果cms系统,是目前很多电影网站都在使用的一套网站系统,开源,免费,扩展性较好,支持一键采集,伪静态化,高并发的同时承载,获…

蜻蜓fm收音机电脑版_网页版全网音乐搜索解析下载网站,完全免费使用,支持网易酷狗酷我虾米百度一听咪咕荔枝蜻蜓 喜马拉雅全民K歌...

关注我们一起玩耍吧!微信公众号:微友集市我们不生产资源我们做互联网搬运工这里是“微友集市”,我们坚持分享优质的资源,让更多人能用到更好的资源,少花冤枉钱。如果你有什么需要,可以给我们留言&#xff0…

8x8点阵字体在线生成器_字体字形网站合集

求字体,提供中文和英文字体库下载、识别与预览服务。传送门:http://www.qiuziti.com字体之家,提供各种字体打包下载,中文字体、英文字体、PS字体、艺术字体、手机软件、字体工具等。传送门:http://www.17ziti.com站长字…

.net mvc 获取iis基本登录网站登录账号_超赞!用Java实现了第三方qq账号登录...

传智汇传智播客旗下IT互联网精英社区作者:人间蒸发来源:zuidaima.com/blog/4725615031700480.htmQQ互联注册一个账号网站地址:https://connect.qq.com/,添加一个应用,具体怎么申请以及需要填写的信息,腾讯官…

eclipse tomcat新建一个_Eclipse搭建本地动态网站环境

准备Eclipse和Tomcat完成Web容器的配置在Eclipse中配置Tomcat (web容器)1、选择window->show view->other->servers 下面出现了servers点击 no servers are available click this link to create a new server -> 选择Tomcat7(下载的是7)->点击下一步->browe…