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

news/2024/4/28 16:03:01/文章来源:https://blog.csdn.net/weixin_33850890/article/details/88612495

一.项目简介

    本项目使用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_754679.aspx

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

相关文章

网站解析的因素

对于网站来说,搜索引擎优化(SEO)是至关重要的,采用易于搜索引擎索引的合理手段,使网站各项基本要素适合搜索引擎的检索原则并且对用户更友好(Search Engine Friendly),从而更容易被搜…

低成本打造一个带宽无限的网站(四)

分块处理 上一篇曾提到,我们可对资源加密存储,然后在 SW 中进行解密。 理论上这当然可行,但事实上会出现一些问题:我们必须等整个资源下载完成后,才能开始解密操作。这对于用户体验,会产生很大的影响。 假如…

大型网站技术架构演化

一、大型网站软件系统的特点 1.高并发、大流量 a.什么是高并发? 高并发是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理多个请求。 b.高并发的衡量指标有哪些? (1)响应时间:系统对请求做出响应。例如系统…

搜索引擎排名都选乐云seo_seo网站优化百度排名首页360搜狗搜索引擎排名首页

最新活动:接网站排名首页,按照关键词计算,不接敏感词,不上首页不收费!seo的用途?1seo概念Seo就是搜索引擎优化的缩写,也叫网站优化,主要作用就是针对于网站在搜索引擎的排名的一门技…

php末尾友链,与php程序员的笔记网站交换友链的原则

很抱歉,由于本网站首页友链已满,目前停止交换首页友链,内页仍可交换友链!(2013年2月24日)随着本站友链的数量不断增多,本人不得不对本站的友链申请的原则进行郑重的申明一下,希望各位申请本站友链的站长们理…

C#队列Queue实现一个简单的电商网站秒杀程序

电商的秒杀和抢购,对程序员来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。 我们直接…

千万pv网站架构之RabbitMQ

千万pv网站架构之RabbitMQ 简介 什么是RabbitMQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用链接来…

ssm重新开发计科院新闻网站

本次的开发主要是套入SSM框架,并在前面的新闻网站的开发的基础上套入easyui的前段框架对新闻后台的增删改查的一个管理 但是实验完成过程中还有几个问题尚未解决 其一是上传新闻时,不能上传图片,这一问题在ueditor中可以进一步完善 其二在查看…

.NET使用ServerManager获取网站物理路径

最近因为工作需要,用wpf做了一个辅助小工具,如下图 为了获取网站的物理路径,我分析了通过ServerManager获取到的变量,也通过百度搜索了很多,但仍然没有找到方法。 后来使用必应,在国外网站找到了&#xff0…

Linux系统定时备份网站文件到七牛云存储脚本

1、七牛云账号注册。 有些朋友可能会问为什么要备份到七牛云?很简单,七牛云免费注册就能获取1G的存储空间,只要简单几步操作完成实名认证即可获取10G的存储空间,对于一般个人站点来说已经足够备份使用了。如果还没有七牛云存储空间…

WP的SEO工具汇总

Baidu Sitemap Generator 百度站点地图生成工具 https://wordpress.org/plugins/baidu-sitemap-generator/ This pulgin generates a Baidu XML-Sitemap for WordPress Blog. Also Build a real Static Sitemap-Page for all Search Engine. | 生成百度 Sitemap XML 文件。就相…

Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告

开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> Mozilla 正致力于 优化 Firefox Monitor 功能,该功能推出于 2018 年,目的是让用户确认他们的账户信息是否泄漏。目前,Mozilla 已经为 Firefox 用…

大数据教程(14.2)网站数据分析(二)

2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章介绍了网站点击流数据分析项目业务背景;本篇博客博主将继续分享网站分析的相关知识。 一、整体技术流程及架构 1.1.数据处理流程 该项目是一个纯粹的数据分析项目,其整体流程基本上就是…

Java 爬虫遇到需要登录的网站,该怎么办?

在做爬虫时,遇到需要登陆的问题也比较常见,比如写脚本抢票之类的,但凡需要个人信息的都需要登陆,对于这类问题主要有两种解决方式:一种方式是手动设置 cookie ,就是先在网站上面登录,复制登陆后…

网站部署到Linux服务器上并添加https证书

用的是Nginx服务器 一、部署 将网站打包成war包 放到Linux的data/wwwroot/default目录 解压:jar -xvf novel.war 删除war包:rm novel.war 删除文件夹 :rm -rf novel 二、申请SSL证书 网站 :https://www.pianyissl.com/ 三、…

当网站遭遇DDOS攻击的解决方案及展望

当网站遭遇DDOS攻击的解决方案及展望一、事件发生春节长假刚过完,WEB就出现故障,下午1点吃完回来,立即将桌面解锁并习惯性的检查了Web服务器。通过Web服务器性能监视软件图像显示的向下滑行的红色曲线看到WEB出现问题了。根据上述的问题&…

基于WebSphere与Domino的电子商务网站构架分析

本文出自 “李晨光原创技术博客” 博客,谢绝转载! 转载于:https://www.cnblogs.com/chenguang/p/3742340.html

随时查看源码的网站---http://www.sooset.com/

由于工作需要经常要在Windows平台下参阅linux源码,以前都用http://lxr.linux.no/来浏览源码(如下图所示),最近发现sooset来浏览更方便,所以介绍给大家分享。导航栏用起来很方便,不是吗?呵呵更多详情请参考&…

大型网站架构之百万PV

一:百万PV架构概述PV(page view,页面浏览量)即点击量,通常是衡量一个网站受欢迎程度的主要指标。本案例采用四层模式实现,主要分为前端反向代理层、web层、数据库缓存层和数据库层。前端反向代理层采用主备模式,web层采…

网站及监控利器 Pandora FMS使用体验

Pandora FMS 是一个 开源的应用程序 ,用来监测网站的各种活动,它可以收到实时的监测报告,并发送到你指定的邮箱,也可以通过e-mail, SMS 发送。 更多Linux下的监控软件请关注《Linux企业应用案例精解》一书本文出自 “李晨光原创技…