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

news/2024/4/28 0:42:35/文章来源:https://blog.csdn.net/weixin_33691817/article/details/88612494

一.项目简介

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

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

相关文章

网站载入测试:Firefox 3.5 Beta 4完胜IE8

上月中旬,微软在一份文档中宣称,根据对全球25大网站(据comScore)载入速度的测 试,IE8比Google Chrome 1.0、Firefox 3.0.5都要快,但根据第三方机构的测试,微软完全没有胜算,而且Firefox随着不断升级领先优势…

华为正式进军互联网 推出白领社交网站AiMi.COM

电信解决方案供应商华为已于近日正式推出白领社交网站AiMi.COM,目前已经开放测试。此举预示着华为正式踏入互联网业务。 首页截图 个人中心截图 AiMi社区定位于满足上班族的网上乐园消遣和娱乐需求。根据测试,AiMi社区界面和目前流行的社交网站没有本质…

分享一些好用的网站

前言 这两年收藏了不少网站,特地整理一下,把一些大家都可能用得上的分享出来,希望能对你有用。 考虑到有一些网站大多数人都知道,所以我就不列出来了。 我把这些网站分为了几大类: 工具类素材类社区类工具类 1、start.…

大型网站架构技术读后感

最近在看趣谈网络协议,顺带看看这本朋友推荐的书,《大型网站技术架构》是由宝架构师李智慧大牛写作的,我把这本书称为“开眼之书”,这本书站在架构的角度讲网站架构,讲的是整体规划和考虑问题的思路,我从事…

web前端开发项目资源网站,私家珍藏!

1.CodePen: http://codepen.io/ 网站里有很多很酷的特效,而且可以看到效果的源代码,也可以看到实现效果,是一个非常不错的前端开发学习资源网站。 这个是CodePen网站里的一个效果的源码截图,是不是很酷呀! …

介绍三个新的流量对比网站

做网站的最关心自己的网站和其他网站之间的流量对比,正因为这样,Alexa才会被大家捧到天上,04年,当时在计算机世界的王翌写了一篇《出卖Alexa 》,基本上把Alexa作弊的黑色产业链公诸于世了。Alexa作弊太严重&#xff0c…

宣传网站的利器——DIY个性化iGoogle主题收藏

摘自《Google API大全——编程开发实例 》第10章“iGoogle主题设计”10.2节 10.2 创建主题的步骤 为iGoogle制作主题,除需要有艺术天赋外,还需要有Web设计、编写代码、调试等计算机相关知识。 简单地说,创建一个主题有以下3个步骤&#xff…

独家:.NET开发人员必知的八个网站

当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一,或者想要成为其中之一的话,我下面将要列出的每一个站点都应该是你的最爱,都应该收藏到书签中去。 对于不熟悉.NET技术的朋友,需要说明一下,.NET提供…

好玩的网站“彩蛋”们(程序员视角)...

看电影的时候,制作商会在影片最后,给我们留彩蛋. 浏览网站的时候,网站的运营商也会给我们留彩蛋... 图形类彩蛋 知乎 https://www.zhihu.com/ 知乎想来知乎工作?请发送邮件到 jobszhihu.com 天猫 https://www.tmall.com/ 天猫喵~ 加入我们吧 http://tb.cn/iS8NB…

前端脚本!网站图片素材中文转英文

写网页的时候, 我们经常需要使用图片素材, 图片素材如果是中文名, 挂到服务器会会引发乱码, 我们需要将图片名称改为英文字符才可以使用而起名是一个世界级难题, 为图片素材起英文名更是一件极其蛋疼的事有些人英语不好, 直接用拼音命名, 而拼音闹出的笑话更是无法计量...最近接…

用gogs搭建属于自己的git网站

如果你对docker的操作不太了解, 建议先阅读 从零搭建docker私有仓库 gogs是一款极易搭建的自助 Git 服务, 掌握了它, 我们就可以搭建自己的git服务站点gogs官网: https://gogs.io/, github中文地址:https://github.com/gogs/gogs/blob/master/README_ZH.md 实验环境: 腾讯云 c…

chrome小众插件 一键查找姊妹网站 SimilarSites

当你浏览一个很棒的站点的时候, 或许你会想到, 和它"差不多"的站点有哪些, 尤其是针对一些资源站点, 这个站点没有, 而它同类的站点"往往有"! 这里推荐一个很有意思的chrome的插件SimilarSites, 它的作用只有一个, 发现同类站点~ 官方介绍: 当访问任何网站…

Chrome批量打开多个网站

对于大多数人而言, 常用的网站也就那么几个在不同的场景, 你需要打开的网站是不同的如果你是一个动漫爱好者, 你或许会同时追多部动漫, 而这些动漫往往还都只能在特定的网站才能看到 以追动漫为例 你在追《银魂》,你需要打开优酷你在追《魔道祖师》,你需要打开腾讯视频你在追《…

whatruns一键分析网站技术栈

对于一个前端程序员, 每当看到一个全新的网站, 往往会想到, 这个网站是用什么技术完成的?你可以通过打开开发者工具, 查看网站源码, 进而了解网站的技术细节, 但效率不高, 而且可能会漏掉一些技术.分析网站的工具有很多, 但质量良莠不齐, 有的是版本陈旧, 很少维护, 无法识别新…

nginx托管静态网站

今天测试 layuimini,提示需要在 Tomcat 或 nginx 上托管,不像 Bootstrap 可以直接打开 html 页面运行。那就托管(或者叫部署) 到 nginx 上吧。步骤如下。 将下载的 layuimin 包拷贝到 nginx 的安装目录下: 然后进入 conf 文件夹&#xff0c…

《Dark Reader》为任意网站启用夜间模式

先放两张对比图 Dark Reader启用后Dark Reader启用前Dark Reader是一款Chrome护眼插件,可以实时生成黑色主题,为任意网站启用夜间模式 开启和关闭插件有的网站的配色本来就很美, 可以对特定网站禁用Dark Reader至此, DarkReader的功能已经可以满足你日…

《Quickey Launcher》给常用网站绑定emoji快捷键

Quickey Launcher以优雅的方式, 为任意网页绑定一个快捷键, 绑定完成后, 即可通过快捷键,打开网页 为特定网址绑定特定字母 我们可以为以下三个不同网址绑定三个不同的字母B 绑定 https://bilibili.comC 绑定 https://github.com/zhaoolee/ChromeAppHeroesT 绑定 https://gith…

《Alexa Traffic Rank》一键查看网站全球排名

有一个名为Alexa的网站, 专注于对全球网站进行排名 查询网站的方法(以掘金 juejin.im为例)但上面的方法, 需要输入网站的域名, 有点麻烦, 所以官方提供了这个插件, 使用方法如下图所示扩展下载地址 https://chrome.google.com/webstore/detail/alexa-traffic-rank/cknebhggcce…

3行代码 为网站添加萌萌哒看板娘

看板娘一词源自日语“看板娘(かんばんむすめ)”。其中的“看板”指的是店面招牌,或者是为了宣传、打广告而制作的宣传牌。“看板娘”也就是店面的招牌姑娘,亦即能够提升店面人气和顾客流量的女服务生、女店员等。也就是说,看板娘本身就是一块…

《Site Palette》自动提取网站配色

Site Palette是一款自动提取网站配色的扩展程序,有助于开发者快速了解网站的"调(四声diao)性" Site Palette对于设计师非常友好 提取出的颜色可以点击复制色值,直接使用image提取出的颜色,也可以导出为sketch和Adobe的色板image借助三方网站Google Art可以寻找与配…