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

news/2024/4/27 13:38:20/文章来源:https://blog.csdn.net/weixin_33841503/article/details/88612491

一.项目简介

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

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

相关文章

网站安装打包 新建网站[四][虚拟目录及其它方法] 下

接上一节,网站安装打包 新建网站[四][创建网站] 中 这里提供一下创建虚拟目录的大体方法,虚拟目录是通过Root节点去创建的: 创建虚拟目录 publicboolCreateWebVirtualDir(stringvirtualName, stringvirtualPath, stringsiteID, outstringmsg) { …

电子商务网站必须具备的六大功能

现在的社会不仅是交通拥堵,就连互联网上电子商务网站也是一波接一波的上线,然后又有一波接一波的退出互联网舞台,如此接踵而至的电子商务网站,他们为什么没有从本质上解决我的网站无法吸引客户,当然这和电子商务运营产…

国内问答网站浅析

自半年前类Quora网站“知乎(zhihu.com)” 内测以来,国内多家互联网公司也陆续推出了针对不同市场细分的问答类产品。诸如百度旗下的“新知(xinzhi.com)”,人人旗下的“车问网 (chewen.com&#…

200佳优秀的国外设计网站推荐(系列二十)

这个系列将向大家200佳优秀的国外设计网站,包括网页设计、名片设计、LOGO设计和包装设计等等,设计师们可通过这些网站收集的优秀设计作品来获取灵感,进而设计出更具有创意的作品,设计师们也可以把自己得意的作品提交到这些网站&am…

网站设计常用技巧收集

先说一下写这篇文章的目的吧,这上面的东西很多不是我写的,也不是我总结的,这点我肯定,呵呵,我希望大家也能提提你自己的建议,希望不断总结,让更多的网站设计技巧出现在这里,方便 查找…

大流量网站的底层系统架构

动态应用,是相对于网站静态内容而言,像我们.NET 服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。 大型动态应用系统平台主要是针对于大流量…

ping网站的IP显示TTL expired in transit

今早服务器报警 ,不能访问,于是乎cmd进入命令行,ping了一下,出现TTL expired in transit ping了一下baidu是正常的,猜测机房出现了问题。 网上查了一下TTL expired in transit 出现的情况有两种: 1. TTL值太…

这网站有很多不错的IOS代码

2019独角兽企业重金招聘Python工程师标准>>> http://code4app.com/ http://www.charcoaldesign.co.uk/source/cocoa#glview 转载于:https://my.oschina.net/ahuaahua/blog/65044

2345浏览器网址导航_知名导航网站被曝弹窗携带病毒,不点击也会被盗取QQ及游戏账号...

4月1日,火绒安全实验室发出警报,部分“2345导航站”首页的弹窗广告携带盗号木马,该病毒会盗取QQ及游戏平台(steam、WeGame、地下城与勇士、英雄联盟、穿越火线)的账号密码。绝大部分的国内用户,都没有自定义浏览器主页和新标签页的…

waf添加_超简单GOODWAF免费云WAF防火墙,防止网站被恶意攻击

作为一个中小网站的运营站长,网站被攻击是常有的事,也是比较令人头疼的事,尤其是碰到cc攻击、sql注入这类问题,轻则网站打不开,严重网站就会被篡改。一旦网站出现了问题,不仅自己网站没法使用,还…

发现“钓鱼网站”的一些思路

发现“钓鱼网站”的一些思路JackZhai背景:钓鱼网站是那些模仿社交、银行、电商等网站,用于骗取用户账户名与密码的“套牌网站”。人们在访问网站时,其URL显示在地址栏中,但URL相似时(可以显示虚假URL),人们常常忽视&am…

html目录框中增加搜索引擎,网站如何添加搜索框?百度站内搜索安装技巧

站内搜索基本上是网站的一个标配了,几乎所有的大型网站都有一个站内搜索框供读者搜索使用,方便用户查找到自己需要的内容。(当然个别网站除外,如单页面网站)写这篇文章是碰到一位网友说他做的织梦站搜索框失效了,技术有限又不懂得…

对某农业专业网站的一次安全检测

对某农业专业网站的一次安全检测Simeon注:本文已经授权比特网安全频道独家发表![url]http://sec.chinabyte.com/421/8624921.shtml[/url]摘要 昨天一个朋友告诉我一个做得不错的网站,次日该网站就被挂马,从我们进行安全检测的经验…

服务器设置网站文件上传大小,服务器设置网站文件上传大小

服务器设置网站文件上传大小 内容精选换一换通过本文档,您可以快速了解华为云CDN的基础知识,如果想了解更多详细信息,可以根据扩展阅读的引导来进行阅读。CDN(Content Delivery Network,内容分发网络)是构建在现有互联网基础之上的…

在ISA里禁止防问一个指定的网站

要想在ISA上禁止一个网站,我们不但要禁止域名,而且要禁止这个网站的IP。也就是用域名+IP来描述目标网络。下面我们来举个例子来禁止百度这个网的访问,用nslookkup查出[url]www.baidu.com[/url]的域名解析结果为202.108.22.43和202…

使用 Nginx 提升网站访问速度

2008 年 7 月 18 日本文主要介绍如何在 Linux 系统上安装高性能的 HTTP 服务器 —— Nginx、并在不改变原有网站结构的条件下用 Nginx 来提升网站的访问速度。Nginx 简介Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/S…

标准之路网站上一篇文章《十天学会web标准(div+css)》的营养精华

以下精华出自如下链接&#xff0c;“http://www.aa25.cn/special/10day/index.shtml”&#xff0c;《十天学会web标准&#xff08;DIVCSS&#xff09;》。 这个内容不要删掉&#xff1a;“<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "…

用户能ping通和tracert通网站,但打不开

问题描述&#xff1a; 最近更换升级了服务器后&#xff0c;一直有个问题&#xff0c;就是很多用户能ping通和tracert通我们的网站&#xff0c;但登陆的时候不正常&#xff0c;偶尔刷新能打开&#xff0c;很不正常。 抓包发现&#xff0c;用户过来的IP能到服务器&#xff0c;但服…

使用SharePoint Workspace 2010同步SharePoint网站

你用什么保存你的文档&#xff1f;U盘、网盘&#xff0c;还是FTP、邮箱&#xff08;网络存储&#xff09;&#xff1f;想没有想过&#xff0c;将你的文档“随手”保存在你的网站并且与你的计算机&#xff08;即使你有多台计算机&#xff09;随时同步&#xff1f;如果你像我一样…

django企业门户网站系统项目(二)

一、项目准备 话不多说&#xff0c;我们开始准备项目的开发环境和软件 我的开发环境是&#xff1a;python 3.7.4&#xff0c;pycharm&#xff08;不知道这个软件的可以去官网下载&#xff0c;百度一下就可以找到&#xff0c;专业版的有学生认证是免费的&#xff0c;不想认证也…