Webpack生成企业站静态页面 - 项目搭建

        现在Web前端流行的三大框架有Angular、React、Vue,很多项目经过这几年的洗礼,已经都 转型使用这三大框架进行开发,那为什么还要写纯静态页面呢?比如Vue中除了SPA单页面开发,也可以使用nuxt.js实现SSR服务端渲染,满足SEO优化。但是对于那些还是在维护老项目,使用MVC、MVP进行开发,或者觉得使用nuxtjs成本较高小型项目,从历史原因和项目实际情况考虑,会退而求其次,让前端快速完成页面框架和样式,交付后端进行数据渲染。

        虽然现在市面上开发静态页面需求量不大,作为个学习和了解,还是决定写下使用webpack如果快速完成静态页面搭建,并能像三大框架一样能实现组件化开发,并使用less/sass/styuls完成样式的预编译,提升静态页面开发效率。

一、环境搭建

1.1 创建项目

        在您的电脑上创建一个项目目录,这里命名为“island",如下图:

1.2 初始化项目

        打开cmd或者IDE编辑工具,打开命令控制台操作界面,初始化生成package.json文件,输入命令”npm init“,如下图:

        命令执行完毕后,目录中就已生成了package.json,如下较:

1.3 安装webpack

        操作命令如下:

npm i -D webpack webpack-cli

        待命令执行完毕后,项目目录中则会生成node_modules,此时webpack已安装成功,如下图:

二、webpack配置文件

2.1 创建配置文件

        在island目录下面创建webpack.config.js文件,以及源文件目录src,先在src目录下创建一个index.js文件作测试,如下l图:

        代码如下:

const { resolve } = require('path');module.exports = {entry: [resolve(__dirname, './src/index.js')],mode: 'production'
}

        此时webpack已经可以正常运行了,在命令行中输入webpack即可,如下图:

        此时island目录中则会多出一个dist目录,在不配置情况下,默认输出目录名称为“dist”。由于output还未配置,webpack默认输出入口文件为main.js,如下图:

2.2  output配置

        output 位于对象顶级键(key),包括了一组选项,指示 webpack 如何去输出、以及在哪里输出你的「bundle、asset 和其他你所打包或使用 webpack 载入的任何内容」。

        将output对js文件输出结果进行修改,代码如下:

const { resolve } = require('path');module.exports = {entry: [resolve(__dirname, './src/index.js')],output: {filename: 'app.bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},mode: 'production'
}

        此时运行结果生成入口的js则从main.js变成app.bundle.js,如下图:

2.3 js资源输出

        如下图,当我们写静态页面时,全有首页、列表页、详情页、联系我们、预约等页面,每个页面有公共资源,也有独有资源,所以这时就需要进行多谁的输出了。

        

        首衔根据上图,把所有html页面和对应页面的js创建好,如下图:

        然后在webpack.config.js中,配置好多入口文件,即可生成对应js文件了(注意:因为现在entry中是多入口文件,所以output中filename不能写死,需要改成[name]动态取对应入口文件名称),代码如下:

const { resolve } = require('path');module.exports = {entry: {index: resolve(__dirname, './src/js/index.js'),list: resolve(__dirname, './src/js/list.js'),article: resolve(__dirname, './src/js/article.js'),contact: resolve(__dirname, './src/js/contact.js'),message: resolve(__dirname, './src/js/message.js'),},output: {filename: '[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},mode: 'production'
}

        此时执行webpack命令,则dist会生成对应的js文件。由于chunkfilename是根据chunk发送的请示去生成的,所以现在还不是根据此格式进行命名,这块后面再讲。如下图:

2.4 提取html页面

        提取生成html文件,需要安装html-loader和html-webpack-plugin,命令如下:

npm i -D html-loader html-webpack-plugin

       html-webpack-plugin配置参数:

名称类型默认值描述
title{String}Webpack App要用于生成的HTML文档的标题
filename{String|Function}'index.html'要写入HTML的文件。默认为index.html。你也可以在这里指定一个子目录(例如:assets/admin.html)。[name]占位符将被条目名称替换。也可以是函数,例如(entryName) => entryName + '.html'。
template{String}``Webpack模板的相对或绝对路径。默认情况下,它将使用src/index。如果它存在的话。详情请参阅文档
templateContent{string|Function|false}false是否可以使用代替模板来提供内联模板
templateParameters{Boolean|Object|Function}false允许覆盖模板中使用的参数
inject{Boolean|String}truetrue || 'head' || 'body' || false将所有资源注入给定模板或templateContent中。当传递'body'时,所有javascript资源将被放置在body元素的底部。'head'将把脚本放在head元素中。传入true将根据scriptLoading选项将其添加到头部/主体。通过false将禁用自动注入。-参见inject:false示例
publicPath{String|'auto'}'auto'用于脚本和链接标记的publicPath
scriptLoading{'blocking'|'defer'|'module'|'systemjs-module'}'defer'现代浏览器支持非阻塞javascript加载('defer')以提高页面启动性能。设置为'module'添加属性type="module"。这也意味着“defer”,因为模块是自动延迟的。
favicon{String}``将给定的图标路径添加到输出HTML中
meta{Object}{}允许注入元标签。例如meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}
base{Object|String|false}false注入一个基本标签。例如:“https://example.com/path/page.html
minify{Boolean|Object}true if mode is 'production', otherwise false控制是否以及以何种方式减少输出。
hash{Boolean}false如果为true,则在所有包含的脚本和CSS文件中附加一个唯一的webpack编译哈希值(即main.js?hash=compilation_hash)。这对缓存很有用
cache{Boolean}true只有在文件被更改时才发出该文件
showErrors{Boolean}true错误详细信息将写入HTML页面
chunks{?}?允许你只添加一些块(例如只添加单元测试块)
chunksSortMode{String|Function}auto允许控制块在包含到HTML之前应该如何排序。允许的值为'none' | 'auto' | 'manual' | {Function}
excludeChunks{Array.<string>}``允许你跳过一些块(例如不添加单元测试块)
xhtml{Boolean}false如果为真,则将链接标记呈现为自关闭(符合XHTML)

        首先我们使用html-webpack-plugin来提取html文件,在webpack.config.js中引用,代码如下:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: {index: resolve(__dirname, './src/js/index.js'),list: resolve(__dirname, './src/js/list.js'),article: resolve(__dirname, './src/js/article.js'),contact: resolve(__dirname, './src/js/contact.js'),message: resolve(__dirname, './src/js/message.js'),},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},plugins: [new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/index.html`),filename: 'index.html',chunks: ['index'],minify: false}),new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/list.html`),filename: 'list.html',chunks: ['list'],        // chunk发送请求生成对应js文件,并引入html中minify: false})],mode: 'production'
}

        如上,先生成首页和列表页的html页面,执行webpack,结果如下图:

        此时在dist目录中已生成了index.html和list.html页面,并且打开index.html页面发现index.bundle.js也自动添加到html页面中了。

2.5 html中图片资源处理

        首先,在src目录下创建images目录用于存储图片资源,并且在index.html页面中添加几张图片引入代码,如下图:

        执行webpack命令后,结果如下图:

        从上图可以看出生成的index.html页面中,资源路径还是和源文件index.html中路径一样,未根据dist目录重构,而且dist目录中也没生成对应images目录及图上资源。从而得出结论html-webpack-plugin并未处理html内容中的图片资源,这里我们将使用html-loader来实现图片资源的提取。

        html-loader配置参数:

名称类型默认值描述
sources{Boolean|Object}true启用/禁用 sources 处理
preprocessor{Function}     undefined允许在处理前对内容进行预处理
minimize{Boolean|Object}在生产模式下为 true,其他情况为 false通知 html-loader 压缩 HTML
esModule{Boolean} true启用/禁用 ES modules 语法

        代码如下:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: {index: resolve(__dirname, './src/js/index.js'),list: resolve(__dirname, './src/js/list.js'),article: resolve(__dirname, './src/js/article.js'),contact: resolve(__dirname, './src/js/contact.js'),message: resolve(__dirname, './src/js/message.js'),},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/index.html`),filename: 'index.html',chunks: ['index'],minify: false}),new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/list.html`),filename: 'list.html',chunks: ['list'],minify: false})],mode: 'production'
}

        此时再运行webpack命令,图片资源就可以构建到dist目录指定位置了,并且index.html中图片资源也一起更新成dist目录中新路径,如下图:

2.6 优化配置文件

         由于后期项目中页面会不断增加,webpack.config.js中同需不断在entry和plugins中添加新内容,久而久之代码会显示的很臃肿,这里将页面部分独立出来,在island目录中新建static.config.js文件,如下图:

        static.config.js文件代码如下,后期有新增页面时,在此配置即可。

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');// 引用JS文件
const scripts = ["index", "list", "article", "contact", "message"];
// 需要生成的静态页面
const htmls = [{name: "index.html", chunks: ['index']},{name: "list.html", chunks: ['list']},{name: "article.html", chunks: ['article']},{name: "contact.html", chunks: ['contact']},{name: "message.html", chunks: ['message']}
];
/*** 静态页面配置*/
module.exports = {// 重组js入口文件entrys: () => {let params = {};scripts.forEach(name => {params[name] = resolve(__dirname, `./src/js/${name}.js`);})return params;},// 重组静态页面文件staticHtmls: () =>  htmls.map(item => {return new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/${item.name}`),filename: item.name,chunks: item.chunks,minify: false});})
}

        webpack.config.js文件代码如下:

const { resolve } = require('path');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [...staticHtmls()],mode: 'production'
}

        优化完成后,此时再运行webpack,所有页面则全部生成,如下图:

2.7 css文件引入

        处理css样式文件,需要安装三个loader,命令如下:

npm i -D style-loader css-loader less-loader

        webpack.config.js中添加处理样式文件的loader,代码如下:

const { resolve } = require('path');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// style-loader 把 CSS 插入到 DOM 中。// css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。{test: /\.css$/i,use: ["style-loader", 'css-loader']},// webpack 将 Less 编译为 CSS 的 loader。{test: /\.less$/i,use: ["style-loader", 'css-loader', 'less-loader']},// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [...staticHtmls()],mode: 'production'
}

        在src目录下创建css目录用于存储样式文件,并创建index.less文件,在js/index.js中引入。

        index.less代码如下:

#app{margin: 0;padding: 0;
}

        js/index.js代码如下:

import '../css/index.less';

        添加后,运行webpack.config.js会发现,构建后的css内容是写在js/index.js文件中,并且index.html在浏览器中打开时,样式内容被动态注入到html页面中,如下图:

2.8 提取CSS为单独文件

        如何提出CSS为单独文件,并能像js文件一样,将引用链接自动添加到html内容中呢?这里就要用到一个新插件:mini-css-extract-plugin,通过命令进行安装,代码如下:

npm i -D mini-css-extract-plugin

        安装完成后,也是通过new实例并放在pugins。另外需要注意的是module中style-loader要替换成mini-css-extract-plugin插件的loader,这个插件将CSS提取到单独的文件中,为每个包含CSS的JS文件创建一个CSS文件,它支持按需加载CSS和SourceMaps。

        它建立在webpack v4新特性(模块类型)之上,需要webpack 4及以上版本才能工作。

        webpack.config.js 代码如下:

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// style-loader 把 CSS 插入到 DOM 中。// MiniCssExtractPlugin.loader 提取CSS为独立文件// css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, 'css-loader']},// webpack 将 Less 编译为 CSS 的 loader。{test: /\.less$/i,use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']},// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [...staticHtmls(),// 提取css文件new MiniCssExtractPlugin({filename: 'css/[name]_bundle.css',      //输出文件})],mode: 'production'
}

        此时运行webpack,样式文件则提取了来了,结果如下图:

2.9 alias别名

        创建 import 或 require 的别名,来确保模块引入变得更简单。例如,指定样式文件src/css 文件夹下的常用模块:

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// style-loader 把 CSS 插入到 DOM 中。// MiniCssExtractPlugin.loader 提取CSS为独立文件// css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, 'css-loader']},// webpack 将 Less 编译为 CSS 的 loader。{test: /\.less$/i,use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']},// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [...staticHtmls(),// 提取css文件new MiniCssExtractPlugin({filename: 'css/[name]_bundle.css',      //输出文件})],resolve: {alias: {// 样式目录路径别名$css: resolve(__dirname, 'src/css')}},mode: 'production'
}

        将index.js中引入的样式文件路径,用$css替换,代码如下:

import '../css/index.less';替换为import '$css/index.less';

        此时再运行webpack,结果还是一样的,样式文件正常构建成功。

2.10 本地服务(devServer)

        webpack-dev-server 能够用于快速开发应用程序,创建本地服务运行;当服务启动时,会解析指定dist目录。

        要想使用devServer,要先安装webpack-dev-server,安装命令:

npm i -D webpack-dev-server

        webpack.config.js 代码如下:

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// style-loader 把 CSS 插入到 DOM 中。// MiniCssExtractPlugin.loader 提取CSS为独立文件// css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, 'css-loader']},// webpack 将 Less 编译为 CSS 的 loader。{test: /\.less$/i,use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']},// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},]},plugins: [...staticHtmls(),// 提取css文件new MiniCssExtractPlugin({filename: 'css/[name]_bundle.css',      //输出文件})],resolve: {alias: {// 样式路径目录别名$css: resolve(__dirname, 'src/css')}},mode: 'production',devServer: {static: {// 指定服务运行目录directory: resolve(__dirname, 'dist')},compress: true,     //gzip压缩port: 3000,         //指定端口号open: true,         //服务启动后自动在浏览器打开hot: true           //开启热更}
}

        devServer添加完成后,在控制台输入命名npx webpack serve,等待服务开始即可。运行结果如下:

2.11 公共文件

        在项目中,会有公共的样式和js功能,所以创建common.js和common.less文件(注意common.less文件需要在common.js文件中引入),如下图:

        common.js文件代码如下:

import '$css/common.less';

        另外将common.js放入到htmlWebpackPlugin的chunks中(注意:entry入口中也要添加common,这里放在scipts数组中)。

        static.config.js 代码如下:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');// 引用JS文件
const scripts = ["common", "index", "list", "article", "contact", "message"];
// 需要生成的静态页面
const htmls = [{name: "index.html", chunks: ['index']},{name: "list.html", chunks: ['list']},{name: "article.html", chunks: ['article']},{name: "contact.html", chunks: ['contact']},{name: "message.html", chunks: ['message']}
];
/*** 静态页面配置*/
module.exports = {// 重组js入口文件entrys: () => {let params = {};scripts.forEach(name => {params[name] = resolve(__dirname, `./src/js/${name}.js`);})return params;},// 重组静态页面文件staticHtmls: () =>  htmls.map(item => {return new HtmlWebpackPlugin({inject: 'body',template: resolve(__dirname, `./src/${item.name}`),filename: item.name,chunks: ['common', ...item.chunks],minify: false});})
}

        此时运行webpack,common.js和common.css则已生成出来,并且引入到所有html内容中,如下图:

2.12 引用jquery

        由于静态页面中资源都打包到一个文件中,体积会越积越大,所以这里将jquery整体暴露给window,这就需要使用到另个loader,首先先安装jquery和expose-loader,命令如下:

// 安装jquery插件
npm i -S jquery
// 安装expose-loader
npm i -D expose-loader

        安装完成后,我们先在common.js文件中添加浏览器控制台输入,并且将jquery构建到dist/js目录中。

        webpack.config.js文件中添加jquery入口文件,如下图:

        static.config.js文件中将jquery添加到每个html谁的的chunks中,如下图

        common.js文件代码如下:

import '$css/common.less';console.log('jquery', jQuery);

        此是运行npx webpack serve,在浏览器打开控制台查看,如下图:

        结果显示jquery不存在,这是因为我们安装的jquery还没有暴露给window对象,现在把expose-loader添加到webpack.config.js中再看看效果,代码如下:

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { entrys, staticHtmls } = require('./static.config');module.exports = {entry: {jquery: ['jquery'],...entrys()},output: {filename: 'js/[name].bundle.js',      // 对入口名称进行命名,clean: true                     // 在生成文件之前清空 output 目录},module: {rules: [// style-loader 把 CSS 插入到 DOM 中。// MiniCssExtractPlugin.loader 提取CSS为独立文件// css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, 'css-loader']},// webpack 将 Less 编译为 CSS 的 loader。{test: /\.less$/i,use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']},// 匹配图片资源,指定构建后存储位置和命名{test: /\.(png|jpg|jpeg|svg|gif)$/i,type: 'asset/resource',generator: {filename: 'images/[name].[ext]'}}, // 匹配html页面,并提取内部资源文件{test: /\.html$/i,loader: "html-loader",exclude: /node_modules/,options: {minimize: false,        // 不压缩html内容}},// 将jquery暴露给全局对象(self、window 和 global){test: require.resolve('jquery'),loader: "expose-loader",options: {exposes: ["$", "jQuery"]}}]},plugins: [...staticHtmls(),// 提取css文件new MiniCssExtractPlugin({filename: 'css/[name]_bundle.css',      //输出文件})],resolve: {alias: {// 样式路径目录别名$css: resolve(__dirname, 'src/css')}},mode: 'production',devServer: {static: {// 指定服务运行目录directory: resolve(__dirname, 'dist')},compress: true,     //gzip压缩port: 3000,         //指定端口号open: true,         //服务启动后自动在浏览器打开hot: true           //开启热更}
}

        expose-loader添加完成后,再运行npx webpack serve,此时jquery在浏览器中则可以全局调用了,如下图:

三、package.json

        最后整理一下项目中所需要的loader、plugin,以及其对应的版本和功能描述。

名称版本描述
webpack^5.91.0webpack
webpack-cli^5.1.4webpack脚手架
webpack-dev-server^5.0.4构建本地开发服务
css-loader^6.10.0处理css文件(css-loader会像import/require()一样解释@import和url(),并解析它们。)
style-loader^3.3.4通过注入<style>标签向DOM添加CSS
less-loader^12.2.0处理 less 的 webpack loader。将 Less 编译为 CSS。
mini-css-extract-plugin^2.8.1将CSS提取到单独的文件中
html-loader^5.0.0HTML导出为字符串。当编译器需要时,提取HTML内容中资源文件。
html-webpack-plugin^5.6.0生成 HTML5 文件
expose-loader^5.0.0允许暴露一个模块(整体或者部分)给全局对象(self、window 和 global)

        本篇内容就先讲到这,如果还需其他功能做进一步完善,可以去webpack了解,地址:webpack 中文文档(@印记中文) https://docschina.org/

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

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

相关文章

基于前端技术实现的全面预算编制系统

前言 在现代商业环境中&#xff0c;预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而&#xff0c;由于市场的不断变化&#xff0c;准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战&#xff0c;建立一个高效的系统来管理和审查销售数据的重…

hbase启动错误-local host is“master:XXXX“ destination is:master

博主的安装前提&#xff1a; zookeeper安装完成&#xff0c;且启动成功 hdfs高可用安装&#xff0c;yarn高可用安装&#xff0c;且启动成功 报错原因&#xff1a;端口配置不对 解决方案&#xff1a; 输入&#xff1a;hdfs getconf -confKey fs.default.name 然后把相应的…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了&#xff0c;本人考的是南京航空航天大学的仪器科学与技术&#xff0c;英一数一电路&#xff0c;以下是成绩单&#xff1a; 平时习惯整理自己的学习体系&#xff0c;以下是一个记录。 其实&#xff0c;每个人都应该训练&#xff0c;看到某一类题目…

2024/03/25(C++·day1)

一、思维导图 二、练习 练习一 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream&g…

# vue刷新当前页面

vue刷新当前页面 背景 在项目开发中遇到了需要刷新当前页面的场景。中途尝试了以下四种方法 1、this. f o r c e U p d a t e ( ) t h i s . forceUpdate() this. forceUpdate()this.forceUpdate() 是Vue.js中的一个方法&#xff0c;用于强制组件重新渲染&#xff0c;即使没有…

景联文科技上新高质量大模型训练数据!

在过去的一年中&#xff0c;人工智能领域呈现出了风起云涌的态势&#xff0c;其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上&#xff0c;上海人工智能实验室的领…

【Android】美团组件化路由框架WMRouter源码解析

前言 Android无论App开发还是SDK开发&#xff0c;都绕不开组件化&#xff0c;组件化要解决的最大的问题就是组件之间的通信&#xff0c;即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter&#xff0c;另一个是美团的WMRouter。这两个路由框架功能都很强大&#xff0…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

[Vue warn]: Invalid vnode type when creating vnode: false

如题&#xff0c;意思是创建vnode时&#xff0c;vnode类型无效:false。 根据右边的索引点进去&#xff0c;发现定位的是组件loading。搜索loading发现声明了变量loading&#xff0c;更改后问题消失。

【python】获取4K壁纸保存到本地文件夹【附源码】

图片信息丰富多彩&#xff0c;许多网站上都有大量精美的图片资源。有时候我们可能需要批量下载这些图片&#xff0c;而手动一个个下载显然效率太低。因此&#xff0c;编写一个简单的网站图片爬取程序可以帮助我们高效地获取所需的图片资源。 目标网站&#xff1a; 如果出现模…

物联网云组态是什么?部署物联网云组态有什么作用?

在信息化与工业化的深度融合进程中&#xff0c;物联网云组态以其独特的优势&#xff0c;正在成为企业数字化转型的重要工具。那么&#xff0c;物联网云组态究竟是什么呢&#xff1f;部署物联网云组态又能给企业带来哪些实质性的好处呢&#xff1f;今天&#xff0c;我们将围绕这…

vue 消息左右滚动(前后无缝衔接)

之前一直用vue-seamless-scroll&#xff0c;无奈此组件有两个缺点不满足实际效果&#xff1a;1&#xff09;标题过长被截取、2&#xff09;标题果断也会滚动&#xff0c;无奈我自己封装一个&#xff0c;满足此两个弊端&#xff0c;也能达到vue-seamless-scroll组件的功能&#…

AI:Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略

AI&#xff1a;Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略 目录 Nvidia官网人工智能大模型工具合集的简介 1、网站主要功能包括: Nvidia官网人工智能大模型工具合集的使用方法 1、SDXL-Turbo的使用 2、GEMMA-7B的…

详解 net user

net user 是 Windows 操作系统自带的一个命令行工具&#xff0c;用于管理和查询本地用户账户信息。在域环境中&#xff0c;它可以用于管理本地用户账户&#xff0c;但对域用户账户的操作能力有限&#xff0c;尤其是查看域账户锁定状态等功能。以下是 net user 命令的详解&#…

【学习】Web安全测试需要考虑哪些情形

一、数据加密 某些数据需要进行信息加密和过滤后才能在客户端和服务器之间进行传输&#xff0c;包括用户登录密码、信用卡信息等。例如&#xff0c;在登录某银行网站时&#xff0c;该网站必须支持SSL协议&#xff0c;通过浏览器访问该网站时&#xff0c;地址栏的http变成https…

中国中药有限公司邀您到场参观2024燕窝滋补品展

参展企业介绍 中国中药有限公司是中国医药集团有限公司&#xff08;简称“国药集团”&#xff09;的全资子公司&#xff0c;是国药集团中药产业板块的核心投资平台&#xff0c;也是中药一类新药、中药科技进步一等奖、中药保密品种——“人工麝香”全国总代理。 公司经营范围…

Python装饰器深度解析:提升代码效率与可读性的实战指南

Python装饰器深度解析&#xff1a;提升代码效率与可读性的实战指南 摘要装饰器简介定义及基本用途装饰器在Python中的角色 装饰器的工作原理Python函数的运行时特性首个装饰器示例&#xff1a;简单函数计时装饰器的执行流程解析 使用装饰器增强函数功能编写可重用的日志记录装饰…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题&#xff1a; Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者&#xff1a; Yile Chen&#xff08;陈亦乐&#xff09; ; Xiucheng Li&#xff08;李修成&#xff09;; Gao Cong&#xff08;丛高&#xff09; ; Zhifeng Ba…

web前端性能优化【多年工作经验总结,一举拿下】

浏览器方面&#xff1a; 减少HTTP请求 HTTP 请求是指客户端&#xff08;例如浏览器&#xff09;向服务器发出的请求消息&#xff0c;用于获取特定资源或执行特定操作 为什么能够优化性能&#xff1f; 减少网络延迟&#xff1a;每次发起HTTP请求都需要经过网络传输&#xff…

openlayers 入门教程(五):sources 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…