webpack5部署vue3商业项目详细流程

web5deployVue3 目录

文章目录

  • 推荐阅读
  • 前言
  • 初始化目录
    • 1. 初始化`webpack.config.js`
    • 2. 安装`webpack`
      • 注意
    • 3. 初始化目录和文件
    • 总结
  • 配置核心功能
    • 问题
    • 1. 安装依赖
    • 2. 修改`webpack.config.js`配置
    • 注意
    • 处理样式
      • 1. 安装依赖
      • 2. 修改`webpack.config.js`配置
      • 注意
    • 处理图片等静态资源
      • 1. 安装依赖
      • 2. 修改`webapck.config.js`配置
    • 创建html文件
      • 1. 安装依赖
      • 2.修改`webpack`配置
      • 注意
    • 开发服务器
      • 1. 安装依赖
      • 2.修改`webpack`配置
    • 清除打包文件
      • 1. 安装依赖
      • 2.修改`webpack`配置
      • 注意
    • 设置环境变量
      • 设置环境变量常见方式
      • 设置
    • 分环境打包
      • 打包压缩
        • 1. 压缩`html`文件
        • 2. 压缩`css`文件
          • 注意
        • 3. 压缩`js`文件
          • 注意
        • 4. 压缩图片
          • 注意
  • 集成TypeScript
    • 配置环境
      • 1. 安装依赖
      • 2. 修改`webpack`配置
      • 3. 初始化`tsconfig.json`文件
      • 注意
    • 重点内容
  • 识别`.Vue`文件
    • 1. 安装依赖
      • 注意
    • 2. 修改`webpack`文件
    • 3. `index.js`文件中引入`vue`
      • 注意
    • Composition API
      • vue2缺失
      • 常用的`Composition API`
      • 深入推荐阅读
      • 响应式系统
        • `vue2.x`核心原理
        • `vue2.x`总结
        • `Vue3`核心原理
      • `vue3`总结
  • 集成 `Vue-Router`
    • 基本使用
      • 1. 安装依赖
      • 2. 创建`Home.vue`和`Me.vue`
      • 3. 创建`router.js`文件
      • 4. 修改`index.js`文件
  • 集成Vuex
    • 基本使用
      • 1. 安装依赖
      • 2. 创建`store.js`文件
      • 3. 修改`index.js`文件
      • 4. 在`App.vue`中获取`vuex`中的数据
        • 注意
  • 集成Vant
    • 1.安装依赖
    • 2.按需引入
      • 1. 依赖
      • 2.修改配置
  • Rem布局适配
    • 1. 安装依赖
    • 2. 添加`.postcssrc.js`
      • 注意
    • 3. 引入和使用
  • 优化
    • 1. 规划目录结构
      • 注意
    • 2. 打包友好提示
      • 1. 安装依赖
      • 2.修改`webpack`配置
    • 3. 分析打包文件大小
      • 1. 依赖
      • 2. 修改`webpack`配置
      • 3. 修改`package.json`
        • 技巧
    • 4. 打包速度
      • 1.安装依赖
        • 注意
      • 2. 修改`webpack`配置
    • 5.缩小打包范围
    • 6. 缓存
      • 1. 安装依赖
      • 2. 修改`webpack`配置
      • 其他
  • 统一代码规范
    • Eslint
    • Perttier
    • stylelint
    • EditorConfig
  • 配置Git Message
    • 1. 依赖
    • 2. 创建`commit.config.js`
    • 3. `package.json`文件中引入`husky`
    • 4. 使用


推荐阅读

  • txm-原文

前言

  • 造轮子理解原理
  • 理解原理后,脚手架提高效率
  • 利用webpack5搭建一个完整的vue3的开发环境

初始化目录


1. 初始化webpack.config.js

npm init -y
效果:
webpack5部署vue3商业项目详细流程_第1张图片

2. 安装webpack

npm install webpack webpack-cli -D

注意

  1. -D等价于--save-dev,开发环境时所需依赖
  2. -S等价于--save,生产环境时所需依赖
    webpack5部署vue3商业项目详细流程_第2张图片
  • 注意更改源

3. 初始化目录和文件

  • 创建webpack.config.js文件用于编写webpack
// webpack.config.js
const path = require('path');

module.exports = {
	mode: 'development',
	entry: './src/index.js',
	output: {
		filename: '[name].js',
		path: path.resolve(__dirname, 'dist')
	}
}
  • 创建src目录存放源代码
// src/index.js
console.log('test webpack');
  • 修改package.json中的scripts字段
  "scripts": {
    "build": "webpack"
  },
  • 打包js
    1. 项目根目录输入npm run build或者只输入webpack
    2. 打包成功后,会在项目的根目录创建一个dist文件夹,打包后的文件就是main.js

效果

webpack5部署vue3商业项目详细流程_第3张图片
在这里插入图片描述

总结

  1. npm初始化
  2. webpack
  3. 修改package.jsonwebpack.config.js
  4. npm run build or webpack

配置核心功能


问题

由于存在一些浏览器无法使用ES6+的高级语法,因此需要转换为ES5

1. 安装依赖

cnpm install @babel/core babel-loader @babel/preset-env -D

2. 修改webpack.config.js配置

// webpack.config.js
const path = require('path');

module.exports = {
	mode: 'development',
	entry: './src/index.js',
	output: {
		filename: '[name].js',
		path: path.resolve(__dirname, 'dist')
	},
	module: {
		rules: [
			{
				test: /\.js$/,
				use: {
					loader: 'babel-loader',
					options: {
						presets: ['@babel/preset-env']
					}
				}
			}
		]
	}
	
}

注意

如果不想将配置写在配置文件中,可以在根目录创建babel.config.js或者babelrc.js


处理样式

  • webpack默认只能打包commonJS规范的js文件
  • 处理其他文件都需要相对应的处理器进行处理

1. 安装依赖

cnpm install style-loader css-loader less less-loader -D

2. 修改webpack.config.js配置

// webpack.config.js
const path = require('path');

module.exports = {
	mode: 'development',
	entry: './src/index.js',
	output: {
		filename: '[name].js',
		path: path.resolve(__dirname, 'dist')
	},
	module: {
		rules: [
			{
				test: /\.js$/,
				use: {
					loader: 'babel-loader',
					options: {
						presets: ['@babel/preset-env']
					}
				}
			},
			{
				test: /\.css$/,
				use: [
					'style-loader',
					'css-loader'
				]
			},
			{
				test: /\.less$/,
				use: [
					'style-loader',
					'css-loader',
					'less-loader'
				]
			}
		]
	}
	
}

注意

loader的配置有很多能优化的地方


处理图片等静态资源

js文件的其他文件打包,webpack都需要特定的处理器进行处理

1. 安装依赖

npm install url-loader file-loader -D

2. 修改webapck.config.js配置

			{
				test: /\.(jpg|png|jpeg|gif|bmp)$/,
				use: {
					loader: 'url-loader',
					options: {
						limit: 1024,
						fallback: {
							loader: 'file-loader',
							options: {
								name: '[name].[ext]'
							}
						}
					}
				}
			},
			{
				test: /\.(mp4|ogg|mp3|wav)$/,
				use: {
					loader: 'url-loader',
					options: {
						limit:1024,
						fallback: {
							loader: 'file-loader',
							options: {
								name: '[name].[ext]'
							}
						}
					}
				}
			}

创建html文件

令打包的js文件自动插入到html模板中

1. 安装依赖

cnpm install html-webpack-plugin -D

2.修改webpack配置

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
// ...
	plugins: [
		new HtmlWebpackPlugin({
			template: './src/index.html',
			filename: 'index.html',
			title: 'vue3 + TS -> web App'
		})
	]

注意

配置动态网页标题时,需要将模板中的</code>标签里的内容换成<code><%= htmlWebpackPlugin.options.title %></code></p> <ul> <li>此处使用<code>webpack</code>会报错<br> <a href="http://img.e-com-net.com/image/info8/db49f476f1f54cdc9badd3720a973524.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/db49f476f1f54cdc9badd3720a973524.jpg" alt="webpack5部署vue3商业项目详细流程_第4张图片" width="650" height="368" style="border:1px solid black;"></a></li> </ul> <p>结果<br> <a href="http://img.e-com-net.com/image/info8/f93c249d423d4d37b6cbd3d820102edf.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/f93c249d423d4d37b6cbd3d820102edf.png" alt="webpack5部署vue3商业项目详细流程_第5张图片" width="843" height="527" style="border:1px solid black;"></a></p> <ul> <li>使用<code>npm run build</code>则会不同,但是title不会改变<br> <a href="http://img.e-com-net.com/image/info8/2444dd3f6ca34516be9b8f728612a05a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2444dd3f6ca34516be9b8f728612a05a.jpg" alt="webpack5部署vue3商业项目详细流程_第6张图片" width="650" height="163" style="border:1px solid black;"></a></li> </ul> <p>结果:没有变成title<br> <a href="http://img.e-com-net.com/image/info8/10f2af6f6e3f4603bb182e03abb959ac.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/10f2af6f6e3f4603bb182e03abb959ac.jpg" alt="webpack5部署vue3商业项目详细流程_第7张图片" width="623" height="218" style="border:1px solid black;"></a></p> <hr> <h2>开发服务器</h2> <p>每次打包后,都需要手动点击<code>dist</code>目录下的<code>index.html</code>看效果,因此,可以设置<code>webpack</code>将打包后的文件自动在浏览器打开</p> <h3>1. 安装依赖</h3> <p><code>cnpm install webpack-dev-server -D</code></p> <h3>2.修改<code>webpack</code>配置</h3> <pre><code class="prism language-javascript">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">//...</span> devServer<span class="token punctuation">:</span> <span class="token punctuation">{</span> port<span class="token punctuation">:</span> <span class="token number">3000</span><span class="token punctuation">,</span> hot<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> open<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> contentBase<span class="token punctuation">:</span> <span class="token string">'../dist'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> </code></pre> <hr> <h2>清除打包文件</h2> <ul> <li>如果打包的文件加了<code>hash</code>,那每次打包生成的文件都会在<code>dist</code>目录保留</li> <li>我们可以使用此清楚插件在打包前先清理以前的打包文件</li> </ul> <h3>1. 安装依赖</h3> <p><code>cnpm install clean-webpack-plugin -D</code></p> <h3>2.修改<code>webpack</code>配置</h3> <pre><code class="prism language-javascript"><span class="token keyword">const</span> <span class="token punctuation">{</span> CleanWebpackPlugin <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'clean-webpack-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">CleanWebPackPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> </code></pre> <h3>注意</h3> <ul> <li>此处直接<code>build</code>会报错<br> <a href="http://img.e-com-net.com/image/info8/a31d2f0bde3b483a8fe25df5f272352f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a31d2f0bde3b483a8fe25df5f272352f.jpg" alt="在这里插入图片描述" width="650" height="85"></a></li> </ul> <hr> <h2>设置环境变量</h2> <h3>设置环境变量常见方式</h3> <ol> <li>命令式</li> <li>配置式</li> <li>创建<code>.env</code>文件</li> <li><code>cross-env</code></li> </ol> <h3>设置</h3> <p>以<code>cross-env</code>的方式来设置环境变量:可以跨终端进行设置</p> <ol> <li>安装依赖<br> <code>cnpm install cross-env -D</code></li> <li>修改<code>package.json</code>配置</li> </ol> <pre><code class="prism language-javascript"> <span class="token string">"scripts"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">"build"</span><span class="token punctuation">:</span> <span class="token string">"webpack"</span><span class="token punctuation">,</span> <span class="token string">"webpack"</span><span class="token punctuation">:</span> <span class="token string">"cross-env NODE_ENV=development webpack"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> </code></pre> <hr> <h2>分环境打包</h2> <ul> <li>在平时项目开发中,会分为三种环境: <ol> <li>开发环境</li> <li>测试环境</li> <li>生产环境</li> </ol> </li> <li>如何配置一个多环境打包?</li> </ul> <h3>打包压缩</h3> <p>开发一个项目的最终要求就是要达到功能完备的情况下,打包体积最小,保证用户体验</p> <h4>1. 压缩<code>html</code>文件</h4> <pre><code>- 修改`webpack`配置 </code></pre> <pre><code class="prism language-javascript"><span class="token keyword">const</span> HtmlWebpackPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'html-webpack-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">HtmlWebpackPlugin</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token operator">+</span> minify<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token operator">+</span> collapseWhitespace<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token comment">// 去掉空格</span> <span class="token operator">+</span> removeComments<span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token comment">// 去掉注释</span> <span class="token operator">+</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> </code></pre> <h4>2. 压缩<code>css</code>文件</h4> <pre><code>1. 安装依赖 </code></pre> <p><code>cnpm install mini-css-extract-plugin optimize-css-assets-webpack-plugin -D</code><br> 2. 修改<code>webpack</code>配置文件</p> <pre><code class="prism language-javascript"><span class="token keyword">const</span> MiniCssExtractPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'mini-css-extract-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> OptimizeCssAssetsWebpackPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'optimize-css-assets-webpack-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> module<span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token comment">// ...</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.css$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> MiniCssExtractPlugin<span class="token punctuation">.</span>loader<span class="token punctuation">,</span> <span class="token string">'css-loader'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.less$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> MiniCssExtractPlugin<span class="token punctuation">.</span>loader<span class="token punctuation">,</span> <span class="token string">'css-loader'</span><span class="token punctuation">,</span> <span class="token string">'less-loader'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token comment">// ...</span> <span class="token keyword">new</span> <span class="token class-name">OptimizeCssAssetsWebpackPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">MiniCssExtractPlugin</span><span class="token punctuation">(</span><span class="token punctuation">{</span> filename<span class="token punctuation">:</span> <span class="token string">'css/[name].css'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> </code></pre> <h5>注意</h5> <p><code>purgecss-webpack-plugin</code>用于清除无用的<code>css</code></p> <h4>3. 压缩<code>js</code>文件</h4> <pre><code>1. 安装依赖 </code></pre> <p><code>cnpm install terser-webpack-plugin -D</code><br> 2. 修改<code>webpack</code>配置</p> <pre><code class="prism language-javascript"><span class="token keyword">const</span> TerserWebpackPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'terser-webpack-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> optimization<span class="token punctuation">:</span> <span class="token punctuation">{</span> minimize<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> minimizer<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">TerserWebpackPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> </code></pre> <h5>注意</h5> <p><code>uglifyjs-webpack-plugin</code>不支持压缩<code>ES6</code>语法的代码</p> <h4>4. 压缩图片</h4> <ol> <li>安装依赖<br> <code>cnpm install image-webpack-loader -D</code></li> <li>修改<code>webpack</code>文件</li> </ol> <pre><code class="prism language-javascript">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> module<span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token comment">// ...</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.(jpg|png|jpeg|gif|bmp)$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'url-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> limit<span class="token punctuation">:</span> <span class="token number">1024</span><span class="token punctuation">,</span> fallback<span class="token punctuation">:</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'file-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'[name].[ext]'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'image-webpack-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> mozjpeg<span class="token punctuation">:</span> <span class="token punctuation">{</span> progressive<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> optipng<span class="token punctuation">:</span> <span class="token punctuation">{</span> enabled<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> pngquant<span class="token punctuation">:</span> <span class="token punctuation">{</span> quality<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">0.65</span><span class="token punctuation">,</span> <span class="token number">0.90</span><span class="token punctuation">]</span><span class="token punctuation">,</span> speed<span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> gifsicle<span class="token punctuation">:</span> <span class="token punctuation">{</span> interlaced<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> webp<span class="token punctuation">:</span> <span class="token punctuation">{</span> quality<span class="token punctuation">:</span> <span class="token number">75</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> </code></pre> <h5>注意</h5> <p>在安装<code>image-webpack-loader</code>依赖时,采用<code>cnpm</code>安装,<code>npm</code>会报错</p> <hr> <h1>集成TypeScript</h1> <hr> <ul> <li>前端工程师必备技能:<code>TypeScript</code></li> <li><code>Vue3</code>源码全部采用<code>TS</code>重写</li> <li>需要掌握的核心概念:泛型、枚举、接口、类、函数等等</li> </ul> <h2>配置环境</h2> <h3>1. 安装依赖</h3> <p><code>cnpm install typescript ts-loader -D</code></p> <h3>2. 修改<code>webpack</code>配置</h3> <pre><code class="prism language-typescript"><span class="token keyword">module</span><span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token keyword">module</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.ts$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'ts-loader'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> </code></pre> <h3>3. 初始化<code>tsconfig.json</code>文件</h3> <p><code>tsc --init</code></p> <h3>注意</h3> <p><code>tsc --init</code>报错没有此命令时,需要先在全局安装<code>npm install -g typescript</code><br> 安装成功:<br> <a href="http://img.e-com-net.com/image/info8/737dc72272b945c98987324c102236a3.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/737dc72272b945c98987324c102236a3.png" alt="在这里插入图片描述" width="631" height="90"></a></p> <h2>重点内容</h2> <ul> <li>泛型</li> <li>接口</li> <li>函数</li> <li>……</li> </ul> <hr> <h1>识别<code>.Vue</code>文件</h1> <hr> <h2>1. 安装依赖</h2> <p><code>cnpm install vue@next -S</code><br> <code>cnpm install vue-loader@next @vue/compiler-sfc</code></p> <h3>注意</h3> <p>如果使用的是<code>Vue2.x</code>,需要安装的是<code>vue-template-complier</code></p> <h2>2. 修改<code>webpack</code>文件</h2> <pre><code class="prism language-javascript"><span class="token keyword">const</span> <span class="token punctuation">{</span> VueLoaderPlugin <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'vue-loader/dist/index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> module<span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.vue$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'vue-loader'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">VueLoaderPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> </code></pre> <h2>3. <code>index.js</code>文件中引入<code>vue</code></h2> <pre><code class="prism language-javscript">import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app') </code></pre> <p>新增<code>App.vue</code>文件</p> <pre><code class="prism language-vue">//App.vue <template> <div> <div>解析vue文件</div> <p>{{name}}</p> </div> </template> <script> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const name = ref('txm'); return { name } } }) </script> </code></pre> <h3>注意</h3> <p><code>defineComponent</code>只是为了在使用<code>vue3</code>时有会很好的语法提示</p> <h2>Composition API</h2> <ul> <li><code>vue3</code>受到<code>React Hooks</code>的启发,将以前的<code>options API</code>改写成<code>函数式API</code></li> <li>优点是将代码进行解耦便于<code>tree-shaking</code>,提高代码的复用率</li> </ul> <h3>vue2缺失</h3> <ul> <li><code>Minxin</code>可以完成公共逻辑代码的抽离,但是<code>Mixin</code>存在诸多缺点</li> <li>命名冲突、同名的方法和计算属性会被覆盖、同名的生命周期都会执行且<code>minxin</code>里的先执行等等</li> </ul> <h3>常用的<code>Composition API</code></h3> <ul> <li>reactive</li> <li>ref</li> <li>effect</li> <li>watch</li> <li>compited</li> <li>生命周期</li> <li>h函数</li> <li>toRefs</li> <li>……</li> </ul> <h3>深入推荐阅读</h3> <ul> <li>Vue 组合式API</li> </ul> <h3>响应式系统</h3> <ul> <li><code>vue2.x</code>的响应式底层核心是采用<code>Object.defineProperty</code>来劫持对象的每个属性的<code>getter</code>和<code>setter</code>,方法是<code>defineReactive</code></li> <li>在获取属性时做依赖收集</li> <li>在更新属性时触发更新</li> </ul> <h4><code>vue2.x</code>核心原理</h4> <pre><code class="prism language-javascript"><span class="token comment">// src\core\observer\index.js</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">observeArray</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">walk</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 处理对象</span> <span class="token function">walk</span> <span class="token punctuation">(</span>obj<span class="token punctuation">:</span> Object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> keys <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> keys<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">defineReactive</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> keys<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 处理数组</span> <span class="token function">observeArray</span> <span class="token punctuation">(</span>items<span class="token punctuation">:</span> Array<span class="token operator"><</span>any<span class="token operator">></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> l <span class="token operator">=</span> items<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i <span class="token operator"><</span> l<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">observe</span><span class="token punctuation">(</span>items<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">defineReactive</span> <span class="token punctuation">(</span> obj<span class="token punctuation">:</span> Object<span class="token punctuation">,</span> key<span class="token punctuation">:</span> string<span class="token punctuation">,</span> val<span class="token punctuation">:</span> any<span class="token punctuation">,</span> customSetter<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token operator">?</span>Function<span class="token punctuation">,</span> shallow<span class="token operator">?</span><span class="token punctuation">:</span> boolean <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> dep <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dep</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> childOb <span class="token operator">=</span> <span class="token operator">!</span>shallow <span class="token operator">&&</span> <span class="token function">observe</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span> Object<span class="token punctuation">.</span><span class="token function">defineProperty</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> key<span class="token punctuation">,</span> <span class="token punctuation">{</span> enumerable<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> configurable<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token keyword">get</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token function">reactiveGetter</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> value <span class="token operator">=</span> getter <span class="token operator">?</span> getter<span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span> <span class="token punctuation">:</span> val <span class="token keyword">if</span> <span class="token punctuation">(</span>Dep<span class="token punctuation">.</span>target<span class="token punctuation">)</span> <span class="token punctuation">{</span> dep<span class="token punctuation">.</span><span class="token function">depend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// 收集依赖</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>childOb<span class="token punctuation">)</span> <span class="token punctuation">{</span> childOb<span class="token punctuation">.</span>dep<span class="token punctuation">.</span><span class="token function">depend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dependArray</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> value <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">set</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token function">reactiveSetter</span> <span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> value <span class="token operator">=</span> getter <span class="token operator">?</span> getter<span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span> <span class="token punctuation">:</span> val <span class="token keyword">if</span> <span class="token punctuation">(</span>setter<span class="token punctuation">)</span> <span class="token punctuation">{</span> setter<span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> newVal<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> val <span class="token operator">=</span> newVal <span class="token punctuation">}</span> childOb <span class="token operator">=</span> <span class="token operator">!</span>shallow <span class="token operator">&&</span> <span class="token function">observe</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> dep<span class="token punctuation">.</span><span class="token function">notify</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// 通知更新</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>处理<code>array</code>和<code>Object</code>时,进行判断,然后分别处理</li> <li>如果多层结构直接进行<code>递归</code>操作,且对象每个属性都劫持,性能会变差</li> </ul> <h4><code>vue2.x</code>总结</h4> <p>缺点:</p> <ul> <li>对象属性的新增和删除无法检测。 解决办法:<code>Vue.$set</code>和<code>Vue.delete()</code></li> <li>修改数组的索引和<code>length</code>属性无法检测 解决办法:<code>splice</code></li> </ul> <h4><code>Vue3</code>核心原理</h4> <p>采用了<code>proxy</code>作为底层响应式的核心<code>API</code></p> <pre><code class="prism language-javascript"><span class="token comment">// packages\reactivity\src\reactive.ts</span> <span class="token keyword">function</span> <span class="token function">createReactiveObject</span><span class="token punctuation">(</span> target<span class="token punctuation">:</span> Target<span class="token punctuation">,</span> isReadonly<span class="token punctuation">:</span> boolean<span class="token punctuation">,</span> baseHandlers<span class="token punctuation">:</span> ProxyHandler<span class="token operator"><</span>any<span class="token operator">></span><span class="token punctuation">,</span> collectionHandlers<span class="token punctuation">:</span> ProxyHandler<span class="token operator"><</span>any<span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> proxy <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Proxy</span><span class="token punctuation">(</span> target<span class="token punctuation">,</span> targetType <span class="token operator">===</span> TargetType<span class="token punctuation">.</span><span class="token constant">COLLECTION</span> <span class="token operator">?</span> collectionHandlers <span class="token punctuation">:</span> baseHandlers <span class="token punctuation">)</span> <span class="token keyword">return</span> proxy <span class="token punctuation">}</span> </code></pre> <h3><code>vue3</code>总结</h3> <ul> <li><code>createReactiveObject</code>方法是创建响应式的核心方法</li> <li><code>proxy</code>直接监听整个对象,没有对数组和对象进行分开处理<br> 注意:</li> <li>学习源码时,需要掌握好<code>set</code>, <code>weakset</code>, <code>map</code>, <code>weakmap</code>, <code>reflect</code>等<code>ES6</code>的新特性</li> </ul> <hr> <h1>集成 <code>Vue-Router</code></h1> <hr> <h2>基本使用</h2> <h3>1. 安装依赖</h3> <p><code>npm install vue-router@4 -S</code></p> <h3>2. 创建<code>Home.vue</code>和<code>Me.vue</code></h3> <pre><code class="prism language-vue">// Home.vue // Home.vue <template> <div> 首页 </div> </template> <script> import { defineComponent, ref } from "vue"; export default { name: 'Home' } </script> // Me.vue // Me.vue <template> <div> 我的页面 </div> </template> <script> import { defineComponent, ref } from 'vue'; export default { name: 'Me' } </script> </code></pre> <h3>3. 创建<code>router.js</code>文件</h3> <pre><code class="prism language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span> createRouter<span class="token punctuation">,</span> createWebHistory <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vue-router"</span><span class="token punctuation">;</span> <span class="token keyword">import</span> Home <span class="token keyword">from</span> <span class="token string">'./Home.vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> Me <span class="token keyword">from</span> <span class="token string">'./Me.vue'</span><span class="token punctuation">;</span> <span class="token keyword">const</span> routerHistory <span class="token operator">=</span> <span class="token function">createWebHistory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">createRouter</span><span class="token punctuation">(</span><span class="token punctuation">{</span> history<span class="token punctuation">:</span> routerHistory<span class="token punctuation">,</span> routes<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path<span class="token punctuation">:</span> <span class="token string">'/home'</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token string">'Home'</span><span class="token punctuation">,</span> component<span class="token punctuation">:</span> Home <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token punctuation">:</span> <span class="token string">'/me'</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token string">'Me'</span><span class="token punctuation">,</span> component<span class="token punctuation">:</span> Me <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> router<span class="token punctuation">;</span> </code></pre> <h3>4. 修改<code>index.js</code>文件</h3> <pre><code class="prism language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'test webpack'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> createApp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App.vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> router <span class="token keyword">from</span> <span class="token string">'./router.js'</span><span class="token punctuation">;</span> <span class="token function">createApp</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>router<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span><span class="token string">'#app'</span><span class="token punctuation">)</span> </code></pre> <hr> <h1>集成Vuex</h1> <hr> <h2>基本使用</h2> <h3>1. 安装依赖</h3> <p><code>cnpm install vuex@next -S</code></p> <h3>2. 创建<code>store.js</code>文件</h3> <pre><code class="prism language-javscript">import { createStore } from "vuex"; const store = createStore({ state: { name: 'vuex' }, getters: {}, actions: {}, mutations: {}, modules: {} }); export default store; </code></pre> <h3>3. 修改<code>index.js</code>文件</h3> <pre><code class="prism language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'test webpack'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> createApp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App.vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> router <span class="token keyword">from</span> <span class="token string">'./router.js'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> store <span class="token keyword">from</span> <span class="token string">"./store.js"</span><span class="token punctuation">;</span> <span class="token function">createApp</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>router<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>store<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span><span class="token string">'#app'</span><span class="token punctuation">)</span> </code></pre> <h3>4. 在<code>App.vue</code>中获取<code>vuex</code>中的数据</h3> <pre><code class="prism language-javascript"><span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> <span class="token operator">...</span> <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>p<span class="token operator">></span>获取vuex里面的数据<span class="token punctuation">{</span><span class="token punctuation">{</span>count<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> <span class="token operator">...</span> <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> defineComponent<span class="token punctuation">,</span> computed <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> useStore <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuex'</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineComponent</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token function">useStore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">computed</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>count<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> count <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> </code></pre> <h4>注意</h4> <ol> <li>用<code>computed</code>从<code>store</code>中获取数据,保证数据的响应式</li> <li>不熟悉,推荐阅读:Vue3快速入门</li> </ol> <hr> <h1>集成Vant</h1> <hr> <h2>1.安装依赖</h2> <p><code>cnpm install vant@next -S</code></p> <h2>2.按需引入</h2> <h3>1. 依赖</h3> <p><code>cnpm i babel-plugin-import ts-import-plugin -D</code></p> <h3>2.修改配置</h3> <pre><code class="prism language-javascript"><span class="token operator">></span> <span class="token constant">JS</span> <span class="token comment">// babel.config.js</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">'import'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> libraryName<span class="token punctuation">:</span> <span class="token string">'vant'</span><span class="token punctuation">,</span> libraryDirectory<span class="token punctuation">:</span> <span class="token string">'es'</span><span class="token punctuation">,</span> style<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">'vant'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <blockquote> <p>TS</p> </blockquote> <pre><code class="prism language-typescript"><span class="token keyword">const</span> tsImportPluginFactory <span class="token operator">=</span> <span class="token keyword">require</span><span class="token punctuation">(</span><span class="token string">'ts-import-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">module</span><span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token keyword">module</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.ts$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'ts-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> transpileOnly<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> getCustomTransformers<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span><span class="token punctuation">{</span> before<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token function">tsImportPluginFactory</span><span class="token punctuation">(</span><span class="token punctuation">{</span> libraryName<span class="token punctuation">:</span> <span class="token string">'vant'</span><span class="token punctuation">,</span> libraryDirectory<span class="token punctuation">:</span> <span class="token string">'es'</span><span class="token punctuation">,</span> style<span class="token punctuation">:</span> <span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">/style/less`</span></span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span> compilerOptions<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token keyword">module</span><span class="token punctuation">:</span> <span class="token string">'es2015'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> exclude<span class="token punctuation">:</span> <span class="token regex">/node_modules/</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <hr> <h1>Rem布局适配</h1> <hr> <h2>1. 安装依赖</h2> <p><code>cnpm install lib-flexible -S</code><br> <code>cnpm install postcss-pxtorem -D</code></p> <h2>2. 添加<code>.postcssrc.js</code></h2> <pre><code class="prism language-javascript">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> plugins<span class="token punctuation">:</span><span class="token punctuation">{</span> <span class="token comment">// autoprefixer: {</span> <span class="token comment">// browsers: ['Android >= 4.0', 'iOS >= 8']</span> <span class="token comment">// },</span> <span class="token string">'postcss-pxtorem'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token comment">// rootValue: 37.5, // Vant 官方根字体大小是 37.5</span> <span class="token function">rootValue</span><span class="token punctuation">(</span><span class="token punctuation">{</span>file<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> file<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'vant'</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">?</span> <span class="token number">37.5</span> <span class="token punctuation">:</span> <span class="token number">75</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> propList<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'*'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> selectorBlackList<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'.norem'</span><span class="token punctuation">]</span> <span class="token comment">// 过滤掉.norem-开头的class,不进行rem转换</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <h3>注意</h3> <p>browsers 选项需配置在 package.json,不然打包会有警告</p> <pre><code class="prism language-json"><span class="token comment">// package.json</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token string">"browserslist"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"> 1%"</span><span class="token punctuation">,</span> <span class="token string">"last 2 versions"</span><span class="token punctuation">,</span> <span class="token string">"not dead"</span><span class="token punctuation">,</span> <span class="token string">"Android >= 4.0"</span><span class="token punctuation">,</span> <span class="token string">"iOS >= 8"</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> </code></pre> <h2>3. 引入和使用</h2> <pre><code class="prism language-javascript"><span class="token comment">// index.js</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> createApp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span> <span class="token operator">+</span> <span class="token keyword">import</span> <span class="token string">'lib-flexible/flexible'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App.vue'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> router <span class="token keyword">from</span> <span class="token string">'./router.js'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> store <span class="token keyword">from</span> <span class="token string">'./store.js'</span><span class="token punctuation">;</span> <span class="token function">createApp</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>router<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>store<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span><span class="token string">'#app'</span><span class="token punctuation">)</span> <span class="token comment">// Home.vue</span> <span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span>div<span class="token operator">></span> 首页 <span class="token operator"><</span>v<span class="token operator">-</span>button plain hairline type<span class="token operator">=</span><span class="token string">"primary"</span><span class="token operator">></span>细边框按钮<span class="token operator"><</span><span class="token operator">/</span>v<span class="token operator">-</span>button<span class="token operator">></span> <span class="token operator"><</span>v<span class="token operator">-</span>button plain hairline type<span class="token operator">=</span><span class="token string">"primary"</span><span class="token operator">></span>细边框按钮<span class="token operator"><</span><span class="token operator">/</span>v<span class="token operator">-</span>button<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> defineComponent<span class="token punctuation">,</span> ref <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vue"</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> Button <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vant"</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineComponent</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">"Home"</span><span class="token punctuation">,</span> components<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">"v-button"</span><span class="token punctuation">:</span> Button <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> </code></pre> <hr> <h1>优化</h1> <hr> <ul> <li>项目的重点部分</li> <li>保证功能完整的情况下,打包体积大大缩小<br> 常见优化手段:</li> </ul> <h2>1. 规划目录结构</h2> <p><code>webpack5</code>将各个环境配置好后,规范一下项目的目录结构<br> <code>tree -I "node_modules"</code></p> <pre><code class="prism language-shell">├─dist │ ├─css │ └─js <span class="token operator">|</span> <span class="token operator">|</span>-favicon.ico <span class="token operator">|</span> <span class="token operator">|</span>-index.html ├─node_modules ├─public <span class="token operator">|</span> <span class="token operator">|</span>-index.html <span class="token operator">|</span> <span class="token operator">|</span>-favicon.ico └─src <span class="token operator">|</span> ├─api <span class="token operator">|</span> ├─components <span class="token operator">|</span> ├─hooks <span class="token operator">|</span> ├─router <span class="token operator">|</span> ├─store <span class="token operator">|</span> ├─utils <span class="token operator">|</span> └─views <span class="token operator">|</span> <span class="token operator">|</span>-App.vue <span class="token operator">|</span> <span class="token operator">|</span>-main.ts <span class="token operator">|</span>-.gitigore <span class="token operator">|</span>-babel.config.js <span class="token operator">|</span>-package.json <span class="token operator">|</span>-shims-vue.d.ts <span class="token operator">|</span>-tsconfig.json <span class="token operator">|</span>-webpack.config.js </code></pre> <ul> <li>此目录类似<code>vue</code>脚手架生成的项目目录</li> </ul> <h3>注意</h3> <p>由于<code>typescript</code>只能理解<code>.ts</code>文件,无法理解<code>.vue</code>文件,需要在根目录创建一个后缀名为<code>.d.ts</code>文件</p> <pre><code class="prism language-javascript"><span class="token comment">// shims-vue.d.ts</span> declare module <span class="token string">'*.vue'</span> <span class="token punctuation">{</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> ComponentOptions <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span> <span class="token keyword">const</span> componentOptions<span class="token punctuation">:</span> ComponentOptions<span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> componentOptions<span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <h2>2. 打包友好提示</h2> <h3>1. 安装依赖</h3> <p><code>cnpm install friendly-errors-webapck-plugin node-notifier -D</code></p> <h3>2.修改<code>webpack</code>配置</h3> <pre><code class="prism language-js"><span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">+</span> <span class="token keyword">const</span> FriendlyErrorsWebpackPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'friendly-errors-webpack-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">+</span> <span class="token keyword">const</span> notifier <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'node-notifier'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">+</span> <span class="token keyword">const</span> icon <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'public/icon.jpg'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">FriendlyErrorsWebpackPlugin</span><span class="token punctuation">(</span><span class="token punctuation">{</span> onErrors<span class="token punctuation">:</span> <span class="token punctuation">(</span>severity<span class="token punctuation">,</span> errors<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> notifier<span class="token punctuation">.</span><span class="token function">notify</span><span class="token punctuation">(</span><span class="token punctuation">{</span> title<span class="token punctuation">:</span> <span class="token string">'webpack 编译失败了~'</span><span class="token punctuation">,</span> message<span class="token punctuation">:</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>severity<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>errors<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span><span class="token punctuation">,</span> subtitle<span class="token punctuation">:</span> errors<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>file <span class="token operator">||</span> <span class="token string">''</span><span class="token punctuation">,</span> icon<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <h2>3. 分析打包文件大小</h2> <h3>1. 依赖</h3> <p><code>cnpm install webpack-bundle-analyzer -D</code></p> <h3>2. 修改<code>webpack</code>配置</h3> <pre><code class="prism language-js"><span class="token operator">+</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> BundleAnalyzerPlugin <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'webpack-bundle-analyzer'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">BundleAnalyzerPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <h3>3. 修改<code>package.json</code></h3> <pre><code class="prism language-json"><span class="token punctuation">{</span> <span class="token string">"scripts"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token string">"analyzer"</span><span class="token punctuation">:</span> <span class="token string">"webpack --progress"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <h4>技巧</h4> <ul> <li>控制台执行<code>npm run analyzer</code>,系统自动启动打包报告的HTTP服务器</li> <li>不想启动,可以生成<code>state.json</code>文件,后续查看</li> </ul> <pre><code class="prism language-javascript"><span class="token operator">+</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> BundleAnalyzerPlugin <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'webpack-bundle-analyzer'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">BundleAnalyzerPlugin</span><span class="token punctuation">(</span><span class="token punctuation">{</span> analyzerMode<span class="token punctuation">:</span> <span class="token string">'disabled'</span><span class="token punctuation">,</span> generateStatsFile<span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <ul> <li><code>package.json</code></li> </ul> <pre><code class="prism language-json"><span class="token punctuation">{</span> <span class="token string">"scripts"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token operator">+</span> <span class="token string">"analyzers"</span><span class="token punctuation">:</span> <span class="token string">"webpack-bundle-analyzer --port 3000 ./dist/stats.json"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>通过打包报告可以很直观的知道哪些依赖包大,则可以做做针对性的修改。</li> </ul> <h2>4. 打包速度</h2> <p>此插件可以直观显示每个依赖打包所花费的时间</p> <h3>1.安装依赖</h3> <p><code>cnpm install speed-measure-webpack5-plugin -D</code></p> <h4>注意</h4> <ul> <li><code>webpack5</code>配置此包会报错<br> <a href="http://img.e-com-net.com/image/info8/98b0cddfd4274d35b5091a27fda0a14b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/98b0cddfd4274d35b5091a27fda0a14b.jpg" alt="在这里插入图片描述" width="650" height="97"></a></li> </ul> <h3>2. 修改<code>webpack</code>配置</h3> <pre><code class="prism language-js"><span class="token keyword">const</span> SpeedMeasureWebpack5Plugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'speed-measure-webpack5-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> smw <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SpeedMeasureWebpack5Plugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token function">smw</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// options</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h2>5.缩小打包范围</h2> <ul> <li>exclude:排除某些文件,类似黑名单</li> <li>include:包含文件,类似白名单</li> <li>优先度:exclude >>> include</li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> module<span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.js$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'babel-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> presets<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'@babel/preset-env'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> exclude<span class="token punctuation">:</span> <span class="token regex">/node_modules/</span><span class="token punctuation">,</span> include<span class="token punctuation">:</span> path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'src'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <h2>6. 缓存</h2> <ul> <li>默认<code>babel-loader</code>中可以配置缓存</li> <li>其他<code>loader</code>如果要缓存,需要下载<code>cache-loader</code></li> </ul> <h3>1. 安装依赖</h3> <p><code>cnpm install cache-loader -D</code></p> <h3>2. 修改<code>webpack</code>配置</h3> <pre><code class="prism language-js"><span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> module<span class="token punctuation">:</span> <span class="token punctuation">{</span> rules<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.js$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">{</span> loader<span class="token punctuation">:</span> <span class="token string">'babel-loader'</span><span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">{</span> presets<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'@babel/preset-env'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">+</span> cacheDirectory<span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> test<span class="token punctuation">:</span> <span class="token regex">/\.css$/</span><span class="token punctuation">,</span> use<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'cache-loader'</span><span class="token punctuation">,</span> <span class="token string">'style-loader'</span><span class="token punctuation">,</span> <span class="token string">'css-loader'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// ...</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <h3>其他</h3> <ul> <li>resolve</li> <li>external</li> <li>optimization</li> <li>等等</li> </ul> <hr> <h1>统一代码规范</h1> <hr> <p>统一代码规范:</p> <ul> <li>代码校验</li> <li>代码格式化</li> <li><code>git</code>提交前校验</li> <li>编辑器配置</li> </ul> <h2>Eslint</h2> <p>代码检查工具</p> <ol> <li>新增<code>.eslintrc.js</code></li> </ol> <pre><code class="prism language-js">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> root<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token comment">// 此项是用来告诉eslint找当前配置文件不能往父级查找</span> env<span class="token punctuation">:</span> <span class="token punctuation">{</span> node<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token comment">// 此项指定环境的全局变量,下面的配置指定为node环境</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">extends</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'plugin:vue/recommended'</span><span class="token punctuation">,</span> <span class="token string">'@vue/prettier'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> rules<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">'no-console'</span><span class="token punctuation">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">NODE_ENV</span> <span class="token operator">===</span> <span class="token string">'production'</span> <span class="token operator">?</span> <span class="token string">'warn'</span> <span class="token punctuation">:</span> <span class="token string">'off'</span><span class="token punctuation">,</span> <span class="token string">'no-debugger'</span><span class="token punctuation">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">NODE_ENV</span> <span class="token operator">===</span> <span class="token string">'production'</span> <span class="token operator">?</span> <span class="token string">'warn'</span> <span class="token punctuation">:</span> <span class="token string">'off'</span><span class="token punctuation">,</span> <span class="token string">'vue/no-v-html'</span><span class="token punctuation">:</span> <span class="token string">'off'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> parserOptions<span class="token punctuation">:</span> <span class="token punctuation">{</span> parser<span class="token punctuation">:</span> <span class="token string">'babel-eslint'</span><span class="token punctuation">,</span> parser<span class="token punctuation">:</span> <span class="token string">'babel-eslint'</span><span class="token punctuation">,</span> ecmaVersion<span class="token punctuation">:</span> <span class="token number">7</span><span class="token punctuation">,</span> sourceType<span class="token punctuation">:</span> <span class="token string">'module'</span><span class="token punctuation">,</span> ecmaFeatures<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token comment">// 添加ES特性支持,使之能够识别ES6语法</span> jsx<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> overrides<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <ol start="2"> <li>新增<code>.eslintignore</code>文件</li> </ol> <pre><code class="prism language-yaml"><span class="token comment"># .eslintignore 不需要检查的文件</span> src/assets src/icons public dist node_modules </code></pre> <h2>Perttier</h2> <p>代码格式化工具</p> <ol> <li>新增<code>prettier.config.js</code>文件</li> </ol> <pre><code class="prism language-js">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> printWidth<span class="token punctuation">:</span> <span class="token number">80</span><span class="token punctuation">,</span> tabWidth<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span> useTabs<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> semi<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> singleQuote<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> quoteProps<span class="token punctuation">:</span> <span class="token string">'as-needed'</span><span class="token punctuation">,</span> jsxSingleQuote<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> trailingComma<span class="token punctuation">:</span> <span class="token string">'es5'</span><span class="token punctuation">,</span> bracketSpacing<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> jsxBracketSameLine<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> arrowParens<span class="token punctuation">:</span> <span class="token string">'always'</span><span class="token punctuation">,</span> htmlWhitespaceSensitivity<span class="token punctuation">:</span> <span class="token string">'ignore'</span><span class="token punctuation">,</span> vueIndentScriptAndStyle<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> endOfLine<span class="token punctuation">:</span> <span class="token string">'lf'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <h2>stylelint</h2> <p>规范化<code>css</code>的书写,风格统一,减少错误</p> <ol> <li>新增 <code>.stylelintrc.js</code> 文件</li> </ol> <pre><code class="prism language-js">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">extends</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'stylelint-config-recess-order'</span><span class="token punctuation">,</span> <span class="token string">'stylelint-config-prettier'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <h2>EditorConfig</h2> <ol> <li>新增<code>.editorconfig</code>文件</li> </ol> <pre><code class="prism language-json">root <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">[</span><span class="token operator">*</span><span class="token punctuation">]</span> charset <span class="token operator">=</span> utf<span class="token operator">-</span><span class="token number">8</span> end_of_line <span class="token operator">=</span> lf indent_size <span class="token operator">=</span> <span class="token number">2</span> indent_style <span class="token operator">=</span> space insert_final_newline <span class="token operator">=</span> <span class="token boolean">true</span> trim_trailing_whitespace <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">[</span><span class="token operator">*</span><span class="token punctuation">.</span>md<span class="token punctuation">]</span> trim_trailing_whitespace <span class="token operator">=</span> <span class="token boolean">false</span> </code></pre> <hr> <h1>配置Git Message</h1> <hr> <h2>1. 依赖</h2> <pre><code class="prism language-shell"><span class="token function">npm</span> <span class="token function">install</span> -g commitizen cz-conventional-changelog <span class="token keyword">echo</span> <span class="token string">'{ "path": "cz-conventional-changelog" }'</span> <span class="token operator">></span> ~/.czrc </code></pre> <ul> <li>安装结束后,可以直接使用<code>git cz</code>来取代<code>git commit</code><br> <code>yarn add husky @commitlint/config-conventional @commitlint/cli -D</code></li> <li><code>commit</code>:负责对<code>commit message</code>进行格式检验</li> <li><code>husky</code>:负责提供更易用的<code>git hook</code></li> </ul> <h2>2. 创建<code>commit.config.js</code></h2> <pre><code class="prism language-shell"><span class="token keyword">echo</span> <span class="token string">'module.exports = {extends: ["@commitlint/config-conventional"]};'</span> <span class="token operator">></span> ./commitlint.config.js </code></pre> <ul> <li><code>utf-8</code>格式,否则报错</li> </ul> <h2>3. <code>package.json</code>文件中引入<code>husky</code></h2> <pre><code class="prism language-json"><span class="token string">"husky"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">"hooks"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">"commit-msg"</span><span class="token punctuation">:</span> <span class="token string">"commitlint -e $GIT_PARAMS"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h2>4. 使用</h2> <ul> <li><code>git add .</code></li> <li><code>git cz</code> 选择并输入</li> <li><code>git push -u origin branchname</code></li> </ul> <hr> <p>自动化发布</p> <hr> <p><code>CI/CD</code> 自动化测试发布</p> <pre><code class="prism language-js"><span class="token keyword">let</span> client <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'scp2'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> ora <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'ora'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> chalk <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'chalk'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> spinner <span class="token operator">=</span> <span class="token function">ora</span><span class="token punctuation">(</span>chalk<span class="token punctuation">.</span><span class="token function">green</span><span class="token punctuation">(</span><span class="token string">'正在发布到服务器...'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> spinner<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> client<span class="token punctuation">.</span><span class="token function">scp</span><span class="token punctuation">(</span><span class="token string">'./dist'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// 本地打包的路径</span> <span class="token string">'host'</span><span class="token punctuation">:</span> <span class="token string">'xxx.xxx.x.xxx'</span><span class="token punctuation">,</span> <span class="token comment">// 服务器的IP地址</span> <span class="token string">'post'</span><span class="token punctuation">:</span> <span class="token string">'22'</span><span class="token punctuation">,</span> <span class="token comment">// 服务器的IP地址</span> <span class="token string">'username'</span><span class="token punctuation">:</span> <span class="token string">'xxxx'</span><span class="token punctuation">,</span> <span class="token comment">// 用户名</span> <span class="token string">'password'</span><span class="token punctuation">:</span> <span class="token string">'*****'</span><span class="token punctuation">,</span> <span class="token comment">// 密码</span> <span class="token string">'path'</span><span class="token punctuation">:</span> <span class="token string">'/opt/stu_app_website'</span> <span class="token comment">// 项目需要部署到服务器的位置</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> err <span class="token operator">=></span> <span class="token punctuation">{</span> spinner<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>chalk<span class="token punctuation">.</span><span class="token function">green</span><span class="token punctuation">(</span><span class="token string">'项目发布完毕'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'err'</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <hr> <p>总结</p> <hr> <ul> <li>熟悉整体流程</li> <li>自我提升</li> </ul> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1642832994190286848"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(WEB,javascript,vue.js,typescript,前端,webpack)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950230804957294592.htm" title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a> <span class="text-muted">国服冰</span> <a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div> </li> <li><a href="/article/1950219166367674368.htm" title="包含日志获取webshell" target="_blank">包含日志获取webshell</a> <span class="text-muted">陈望_ning</span> <div>日志文件关闭:Apache目录下的httpd.conf文件#ErrorLog"logs/error.log"#CustomLog"logs/access.log"common加#号为注释不产生日志文件如果去掉#将会在Apache/logs/目录下产生日志文件linux:access_logerror_logwindows:access.logerror.logaccess_log每一行记录了一次网</div> </li> <li><a href="/article/1950208989954371584.htm" title="Selenium 特殊控件操作与 ActionChains 实践详解" target="_blank">Selenium 特殊控件操作与 ActionChains 实践详解</a> <span class="text-muted">小馋喵知识杂货铺</span> <a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>1.下拉框单选操作(a)使用SeleniumSelect类(标准HTML标签)Selenium提供了内置的Select类用于操作标准下拉框,这种方式简单且直观。fromselenium.webdriver.support.uiimportSelect#定位下拉框dropdown=Select(driver.find_element("id","dropdown_id"))#通过以下三种方式选择单个</div> </li> <li><a href="/article/1950205711409541120.htm" title="selenium特殊场景处理" target="_blank">selenium特殊场景处理</a> <span class="text-muted">Monica_ll</span> <a class="tag" taget="_blank" href="/search/Selenium/1.htm">Selenium</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>文章目录前言一、多窗口处理二、浏览器弹窗处理包含alert、confirm、prompt三、鼠标和键盘事件处理前言在使用selenium操作浏览器的过程中可能需要借助键盘和鼠标功能完成一些操作,或者操作弹窗处理,本文主要是整理自己工作过程中使用过的一些方法一、多窗口处理在实际测试过程中经常会有通过点击或者连接打开新的窗口,这种情况下就需要切换webDriver到对应浏览器对象才能操作新窗口的元素。</div> </li> <li><a href="/article/1950194742100815872.htm" title="用代码生成艺术字:设计个性化海报的秘密" target="_blank">用代码生成艺术字:设计个性化海报的秘密</a> <span class="text-muted"></span> <div>本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准</div> </li> <li><a href="/article/1950193733681082368.htm" title="基于Python的AI健康助手:开发与部署全攻略" target="_blank">基于Python的AI健康助手:开发与部署全攻略</a> <span class="text-muted">AI算力网络与通信</span> <a class="tag" taget="_blank" href="/search/AI%E7%AE%97%E5%8A%9B%E7%BD%91%E7%BB%9C%E4%B8%8E%E9%80%9A%E4%BF%A1%E5%8E%9F%E7%90%86/1.htm">AI算力网络与通信原理</a><a class="tag" taget="_blank" href="/search/AI%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%9E%B6%E6%9E%84/1.htm">AI人工智能大数据架构</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>基于Python的AI健康助手:开发与部署全攻略关键词:Python、AI健康助手、机器学习、自然语言处理、Flask、部署、健康管理摘要:本文将详细介绍如何使用Python开发一个AI健康助手,从需求分析、技术选型到核心功能实现,再到最终部署上线的完整过程。我们将使用自然语言处理技术理解用户健康咨询,通过机器学习模型提供个性化建议,并展示如何用Flask框架构建Web应用接口。文章包含大量实际代</div> </li> <li><a href="/article/1950191208873652224.htm" title="vue element 封装表单" target="_blank">vue element 封装表单</a> <span class="text-muted">影子信息</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进</div> </li> <li><a href="/article/1950191165710069760.htm" title="前端面试每日 3+1 —— 第39天" target="_blank">前端面试每日 3+1 —— 第39天</a> <span class="text-muted">浪子神剑</span> <div>今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss</div> </li> <li><a href="/article/1950190325960077312.htm" title="Jupyter Notebook:数据科学的“瑞士军刀”" target="_blank">Jupyter Notebook:数据科学的“瑞士军刀”</a> <span class="text-muted">a小胡哦</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80/1.htm">机器学习基础</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>在数据科学的世界里,JupyterNotebook是一个不可或缺的工具,它就像是数据科学家手中的“瑞士军刀”,功能强大且灵活多变。今天,就让我们一起深入了解这个神奇的工具。一、JupyterNotebook是什么?JupyterNotebook是一个开源的Web应用程序,它允许你创建和共享包含实时代码、方程、可视化和解释性文本的文档。它支持多种编程语言,其中Python是最常用的语言之一。Jupy</div> </li> <li><a href="/article/1950190199627640832.htm" title="selenium 特殊场景处理" target="_blank">selenium 特殊场景处理</a> <span class="text-muted"></span> <div>文章目录前言一、windows的弹窗二、内嵌网页frame三、页签切换四、截图五、弹窗六、JS执行总结前言selenium处理web操作师,有很多特殊的情况需要处理,例如弹窗、内嵌网页,页签切换,js执行等,下面介绍一些可能会遇到的特殊场景一、windows的弹窗importwin32com.client'''创建了一个WScript.ShellCOM(ComponentObjectModel)对</div> </li> <li><a href="/article/1950187554129113088.htm" title="Django学习笔记(一)" target="_blank">Django学习笔记(一)</a> <span class="text-muted"></span> <div>学习视频为:pythondjangoweb框架开发入门全套视频教程一、安装pipinstalldjango==****检查是否安装成功django.get_version()二、django新建项目操作1、新建一个项目django-adminstartprojectproject_name2、新建APPcdproject_namedjango-adminstartappApp注:一个project</div> </li> <li><a href="/article/1950185537319006208.htm" title="新手如何通过github pages静态网站托管搭建个人网站和项目站点" target="_blank">新手如何通过github pages静态网站托管搭建个人网站和项目站点</a> <span class="text-muted">vvandre</span> <a class="tag" taget="_blank" href="/search/Web%E6%8A%80%E6%9C%AF/1.htm">Web技术</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>一、githubpages静态网站托管介绍githubpages它是一个免费快捷的静态网站托管服务。对比传统建站,它有哪些优点呢?在传统方式中,首先要租用服务器,服务器上需要运行外部程序,还需要再购买域名,要配置SSL证书,最后还要配置DNS,将域名解析到服务器。这一套繁琐操作,基本上就把小白劝退了。graphTDA[租用服务器]-->B[部署Web应用(运行外部程序,如Nginx)]B-->C[</div> </li> <li><a href="/article/1950178477592342528.htm" title="前端数据库:IndexedDB从基础到高级使用指南" target="_blank">前端数据库:IndexedDB从基础到高级使用指南</a> <span class="text-muted"></span> <div>文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.</div> </li> <li><a href="/article/1950174441992417280.htm" title="使用Python和Gradio构建实时数据可视化工具" target="_blank">使用Python和Gradio构建实时数据可视化工具</a> <span class="text-muted">PythonAI编程架构实战家</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>使用Python和Gradio构建实时数据可视化工具关键词:Python、Gradio、数据可视化、实时数据、Web应用、交互式界面、数据科学摘要:本文将详细介绍如何使用Python和Gradio框架构建一个实时数据可视化工具。我们将从基础概念开始,逐步深入到核心算法实现,包括数据处理、可视化技术以及Gradio的交互式界面设计。通过实际项目案例,读者将学习如何创建一个功能完整、响应迅速的实时数据</div> </li> <li><a href="/article/1950174315609649152.htm" title="Python Gradio:实现交互式图像编辑" target="_blank">Python Gradio:实现交互式图像编辑</a> <span class="text-muted">PythonAI编程架构实战家</span> <a class="tag" taget="_blank" href="/search/Python%E7%BC%96%E7%A8%8B%E4%B9%8B%E9%81%93/1.htm">Python编程之道</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>PythonGradio:实现交互式图像编辑关键词:Python,Gradio,交互式图像编辑,计算机视觉,深度学习,图像处理,Web应用摘要:本文将深入探讨如何使用Python的Gradio库构建交互式图像编辑应用。我们将从基础概念开始,逐步介绍Gradio的核心功能,并通过实际代码示例展示如何实现各种图像处理功能。文章将涵盖图像滤镜应用、对象检测、风格迁移等高级功能,同时提供完整的项目实战案例</div> </li> <li><a href="/article/1950170156898512896.htm" title="登录功能详解" target="_blank">登录功能详解</a> <span class="text-muted">开往1982</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%99%BB%E5%BD%95/1.htm">登录</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a> <div>本项目由maven项目改造springboot项目导入依赖org.springframework.bootspring-boot-starter-parent2.7.6org.springframework.bootspring-boot-starter-web2.7.6org.springframework.bootspring-boot-starter-test2.7.5org.springf</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950169525244719104.htm" title="从零到一:基于差分隐私决策树的客户购买预测系统实战开发" target="_blank">从零到一:基于差分隐私决策树的客户购买预测系统实战开发</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/%E5%86%B3%E7%AD%96%E6%A0%91/1.htm">决策树</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯文章导航快速导航前言-项目背景与价值项目概览-系统架构与功能技术深度解析-核心算法原理️系统实现详解-工程实践细节性能评估与分析-实验结果分析Web系统开发-前后端开发部署与运维-DevOps实践完整复现指南-手把手教程️实践案例与故障排除-问</div> </li> <li><a href="/article/1950169526440095744.htm" title="从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战" target="_blank">从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战</a> <span class="text-muted"></span> <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是</div> </li> <li><a href="/article/1950164483057971200.htm" title="14.tornado操作之应用Websocket协议实现聊天室功能" target="_blank">14.tornado操作之应用Websocket协议实现聊天室功能</a> <span class="text-muted">孤寒者</span> <a class="tag" taget="_blank" href="/search/Tornado%E6%A1%86%E6%9E%B6%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98/1.htm">Tornado框架从入门到实战</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/tornado/1.htm">tornado</a><a class="tag" taget="_blank" href="/search/%E8%81%8A%E5%A4%A9%E5%AE%A4%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0/1.htm">聊天室功能实现</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二</div> </li> <li><a href="/article/1950163219788132352.htm" title="webSocket双向通信" target="_blank">webSocket双向通信</a> <span class="text-muted">@泽栖</span> <a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>webSocket基础使用webSocket小说明:作用浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。WebSocket与HTTP最大的区别HTTP通信是单向的,基于请求响应模式WebSocket支持双向通信。实现长连接适用场景:消息通信,视频弹幕,实时信息,等双向通信的使用需求使用:引入maven依赖org.springfram</div> </li> <li><a href="/article/1950145701786742784.htm" title="java web开发实战经典 当当_java web项目实战开发" target="_blank">java web开发实战经典 当当_java web项目实战开发</a> <span class="text-muted">飞翔的酋长大人</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E7%BB%8F%E5%85%B8/1.htm">web开发实战经典</a><a class="tag" taget="_blank" href="/search/%E5%BD%93%E5%BD%93/1.htm">当当</a> <div>本书以问题为导向,涵盖JavaWeb开发技术中所有的核心知识点;实战开发案例丰富,所有的知识案例都来源于企业真实项目,实战性和可操作性强;代码注释详细准确,结构简洁清晰;语言简明易懂,由浅入深地带你学会JavaWeb技术及应用。本书面向广大Java开发工程师和普通高校学生,可作为高等学校计算机及其相关专业Web编程技术课程教材,也可供从事JavaWeb应用开发的技术人员学习参考。¥80.00定价:</div> </li> <li><a href="/article/1950145702407499776.htm" title="构建高性能Web应用:深入Spring WebFlux" target="_blank">构建高性能Web应用:深入Spring WebFlux</a> <span class="text-muted">李多田</span> <div>本文还有配套的精品资源,点击获取简介:SpringWebFlux是Spring框架的一部分,支持反应式编程模型,适合高并发和低延迟Web应用。它提供了非阻塞I/O和事件驱动模型,优化了多核处理器资源的使用。SpringWebFlux拥有两种编程模式,核心组件包括WebHandler,RouterFunction,WebFilter,和WebSession。它与高性能服务器集成,并提供反应式HTTP</div> </li> <li><a href="/article/1950144218282389504.htm" title="为什么学习Web前端一定要掌握JavaScript?" target="_blank">为什么学习Web前端一定要掌握JavaScript?</a> <span class="text-muted">web前端学习指南</span> <div>为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。</div> </li> <li><a href="/article/1950143305194991616.htm" title="小架构step系列25:错误码" target="_blank">小架构step系列25:错误码</a> <span class="text-muted">秋千码途</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有</div> </li> <li><a href="/article/1950143304347742208.htm" title="使用Java和Spring WebFlux构建响应式微服务" target="_blank">使用Java和Spring WebFlux构建响应式微服务</a> <span class="text-muted">微赚淘客系统开发者@聚娃科技</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>使用Java和SpringWebFlux构建响应式微服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Java和SpringWebFlux构建响应式微服务。SpringWebFlux是Spring框架的一部分,专为创建响应式应用程序而设计。在这篇文章中,我们将介绍如何使用SpringWebFlux构建响应式微服务,包括基本概念、代码示例以及如何</div> </li> <li><a href="/article/1950141157006700544.htm" title="【Spring WebFlux】为什么 Spring 要拥抱响应式" target="_blank">【Spring WebFlux】为什么 Spring 要拥抱响应式</a> <span class="text-muted">会飞的架狗师</span> <a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/WebFlux/1.htm">WebFlux</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>在现代分布式系统中,响应式系统已成为应对高并发、低延迟需求的核心方案。但构建响应式系统并非易事——它需要框架级别的支持来解决异步处理、资源调度、背压控制等底层问题。作为Java生态中最具影响力的框架,Spring对响应式的支持并非偶然,而是技术演进的必然选择。本文将从响应式系统的构建挑战出发,剖析Spring拥抱响应式的底层逻辑。一、响应式系统的构建困境:现有方案的局限性响应式系统的核心诉求是在有</div> </li> <li><a href="/article/1950140903616212992.htm" title="Java朴实无华按天计划从入门到实战(强化速战版-66天)" target="_blank">Java朴实无华按天计划从入门到实战(强化速战版-66天)</a> <span class="text-muted">岫珩</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%AE%89%E6%8E%92/1.htm">时间安排</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/1.htm">学习计划</a> <div>致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1</div> </li> <li><a href="/article/117.htm" title="Algorithm" target="_blank">Algorithm</a> <span class="text-muted">香水浓</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a> <div>冒泡排序 public static void sort(Integer[] param) { for (int i = param.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { int current = param[j]; int next = param[j + 1];</div> </li> <li><a href="/article/244.htm" title="mongoDB 复杂查询表达式" target="_blank">mongoDB 复杂查询表达式</a> <span class="text-muted">开窍的石头</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>1:count    Pg: db.user.find().count();    统计多少条数据 2:不等于$ne    Pg: db.user.find({_id:{$ne:3}},{name:1,sex:1,_id:0});    查询id不等于3的数据。 3:大于$gt $gte(大于等于) &n</div> </li> <li><a href="/article/371.htm" title="Jboss Java heap space异常解决方法, jboss OutOfMemoryError : PermGen space" target="_blank">Jboss Java heap space异常解决方法, jboss OutOfMemoryError : PermGen space</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a> <div>转自 http://blog.csdn.net/zou274/article/details/5552630 解决办法: window->preferences->java->installed jres->edit jre 把default vm arguments 的参数设为-Xms64m -Xmx512m ----------------</div> </li> <li><a href="/article/498.htm" title="文件上传 下载 解析 相对路径" target="_blank">文件上传 下载 解析 相对路径</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/1.htm">文件上传</a> <div>有点坑吧,弄这么一个简单的东西弄了一天多,身边还有大神指导着,网上各种百度着。 下面总结一下遇到的问题: 文件上传,在页面上传的时候,不要想着去操作绝对路径,浏览器会对客户端的信息进行保护,避免用户信息收到攻击。 在上传图片,或者文件时,使用form表单来操作。 前台通过form表单传输一个流到后台,而不是ajax传递参数到后台,代码如下: <form action=&</div> </li> <li><a href="/article/625.htm" title="怎么实现qq空间批量点赞" target="_blank">怎么实现qq空间批量点赞</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a> <div>纯粹为了好玩!! 逻辑很简单 1 打开浏览器console;输入以下代码。 先上添加赞的代码 var tools={}; //添加所有赞 function init(){ document.body.scrollTop=10000; setTimeout(function(){document.body.scrollTop=0;},2000);//加</div> </li> <li><a href="/article/752.htm" title="判断是否为中文" target="_blank">判断是否为中文</a> <span class="text-muted">灵静志远</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E6%96%87/1.htm">中文</a> <div>方法一: public class Zhidao { public static void main(String args[]) { String s = "sdf灭礌 kjl d{';\fdsjlk是"; int n=0; for(int i=0; i<s.length(); i++) { n = (int)s.charAt(i); if((</div> </li> <li><a href="/article/879.htm" title="一个电话面试后总结" target="_blank">一个电话面试后总结</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>今天,接了一个电话面试,对于还是初学者的我来说,紧张了半天。 面试的问题分了层次,对于一类问题,由简到难。自己觉得回答不好的地方作了一下总结:   在谈到集合类的时候,举几个常用的集合类,想都没想,直接说了list,map。   然后对list和map分别举几个类型:   list方面:ArrayList,LinkedList。在谈到他们的区别时,愣住了</div> </li> <li><a href="/article/1006.htm" title="MSSQL中Escape转义的使用" target="_blank">MSSQL中Escape转义的使用</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/MSSQL/1.htm">MSSQL</a> <div>IF OBJECT_ID('tempdb..#ABC') is not null drop table tempdb..#ABC create table #ABC ( PATHNAME NVARCHAR(50) ) insert into #ABC SELECT N'/ABCDEFGHI' UNION ALL SELECT N'/ABCDGAFGASASSDFA' UNION ALL</div> </li> <li><a href="/article/1133.htm" title="一个简单的存储过程" target="_blank">一个简单的存储过程</a> <span class="text-muted">asialee</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/1.htm">存储过程</a><a class="tag" taget="_blank" href="/search/%E6%9E%84%E9%80%A0%E6%95%B0%E6%8D%AE/1.htm">构造数据</a><a class="tag" taget="_blank" href="/search/%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5/1.htm">批量插入</a> <div>           今天要批量的生成一批测试数据,其中中间有部分数据是变化的,本来想写个程序来生成的,后来想到存储过程就可以搞定,所以随手写了一个,记录在此:            DELIMITER $$ DROP PROCEDURE IF EXISTS inse</div> </li> <li><a href="/article/1260.htm" title="annot convert from HomeFragment_1 to Fragment" target="_blank">annot convert from HomeFragment_1 to Fragment</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%AF%BC%E5%8C%85%E9%94%99%E8%AF%AF/1.htm">导包错误</a> <div>创建了几个类继承Fragment, 需要将创建的类存储在ArrayList<Fragment>中; 出现不能将new 出来的对象放到队列中,原因很简单;     创建类时引入包是:import android.app.Fragment;      创建队列和对象时使用的包是:import android.support.v4.ap</div> </li> <li><a href="/article/1387.htm" title="Weblogic10两种修改端口的方法" target="_blank">Weblogic10两种修改端口的方法</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/%E7%AB%AF%E5%8F%A3%E5%8F%B7/1.htm">端口号</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a><a class="tag" taget="_blank" href="/search/config.xml/1.htm">config.xml</a> <div>一.进入控制台进行修改    1.进入控制台:  http://127.0.0.1:7001/console     2.展开左边树菜单         域结构->环境->服务器-->点击AdminServer(管理) &</div> </li> <li><a href="/article/1514.htm" title="mysql 操作指令" target="_blank">mysql 操作指令</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>一、连接mysql 进入 mysql 的安装目录; $ bin/mysql -p [host IP 如果是登录本地的mysql 可以不写 -p 直接 -u] -u [userName] -p 输入密码,回车,接连; 二、权限操作[如果你很了解mysql数据库后,你可以直接去修改系统表,然后用 mysql> flush privileges; 指令让权限生效] 1、赋权 mys</div> </li> <li><a href="/article/1641.htm" title="【Hive一】Hive入门" target="_blank">【Hive一】Hive入门</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a> <div>Hive安装与配置 Hive的运行需要依赖于Hadoop,因此需要首先安装Hadoop2.5.2,并且Hive的启动前需要首先启动Hadoop。   Hive安装和配置的步骤   1. 从如下地址下载Hive0.14.0   http://mirror.bit.edu.cn/apache/hive/    2.解压hive,在系统变</div> </li> <li><a href="/article/1768.htm" title="ajax 三种提交请求的方法" target="_blank">ajax 三种提交请求的方法</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/jqery/1.htm">jqery</a> <div>1、ajax 提交请求 $.ajax({ type:"post", url : "${ctx}/front/Hotel/getAllHotelByAjax.do", dataType : "json", success : function(result) { try { for(v</div> </li> <li><a href="/article/1895.htm" title="mongodb开发环境下的搭建入门" target="_blank">mongodb开发环境下的搭建入门</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>  linux下安装mongodb 1)官网下载mongodb-linux-x86_64-rhel62-3.0.4.gz 2)linux 解压  gzip -d mongodb-linux-x86_64-rhel62-3.0.4.gz; mv mongodb-linux-x86_64-rhel62-3.0.4 mongodb-linux-x86_64-rhel62-</div> </li> <li><a href="/article/2022.htm" title="编程之美-最短摘要的生成" target="_blank">编程之美-最短摘要的生成</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class ShortestAbstract { /** * 编程之美 最短摘要的生成 * 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的ran</div> </li> <li><a href="/article/2149.htm" title="json数据解析及typeof" target="_blank">json数据解析及typeof</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/typeof/1.htm">typeof</a><a class="tag" taget="_blank" href="/search/json%E8%A7%A3%E6%9E%90/1.htm">json解析</a> <div> // json格式 var people='{"authors": [{"firstName": "AAA","lastName": "BBB"},' +' {"firstName": "CCC&</div> </li> <li><a href="/article/2276.htm" title="流程系统设计的层次和目标" target="_blank">流程系统设计的层次和目标</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a> <div>                               流程系统设计的层次和目标  </div> </li> <li><a href="/article/2403.htm" title="RMAN List和report 命令" target="_blank">RMAN List和report 命令</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/report/1.htm">report</a><a class="tag" taget="_blank" href="/search/rman/1.htm">rman</a> <div>LIST 命令 使用RMAN LIST 命令显示有关资料档案库中记录的备份集、代理副本和映像副本的 信息。使用此命令可列出: • RMAN 资料档案库中状态不是AVAILABLE 的备份和副本 • 可用的且可以用于还原操作的数据文件备份和副本 • 备份集和副本,其中包含指定数据文件列表或指定表空间的备份 • 包含指定名称或范围的所有归档日志备份的备份集和副本 • 由标记、完成时间、可</div> </li> <li><a href="/article/2530.htm" title="二叉树:红黑树" target="_blank">二叉树:红黑树</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%A0%91/1.htm">二叉树</a> <div>    红黑树是一种自平衡的二叉树,它的查找,插入,删除操作时间复杂度皆为O(logN),不会出现普通二叉搜索树在最差情况时时间复杂度会变为O(N)的问题.     红黑树必须遵循红黑规则,规则如下     1、每个节点不是红就是黑。     2、根总是黑的  &</div> </li> <li><a href="/article/2657.htm" title="C语言homework3,7个小题目的代码" target="_blank">C语言homework3,7个小题目的代码</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>1、打印100以内的所有奇数。 # include <stdio.h> int main(void) { int i; for (i=1; i<=100; i++) { if (i%2 != 0) printf("%d ", i); } return 0; }  2、从键盘上输入10个整数,</div> </li> <li><a href="/article/2784.htm" title="自定义按钮, 图片在上, 文字在下, 居中显示" target="_blank">自定义按钮, 图片在上, 文字在下, 居中显示</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89/1.htm">自定义</a> <div>#import <UIKit/UIKit.h> @interface MyButton : UIButton -(void)setFrame:(CGRect)frame ImageName:(NSString*)imageName Target:(id)target Action:(SEL)action Title:(NSString*)title Font:(CGFloa</div> </li> <li><a href="/article/2911.htm" title="MySQL查询语句练习题,测试足够用了" target="_blank">MySQL查询语句练习题,测试足够用了</a> <span class="text-muted">flyvszhb</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>http://blog.sina.com.cn/s/blog_767d65530101861c.html 1.创建student和score表 CREATE  TABLE  student ( id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY  , name  VARCHAR</div> </li> <li><a href="/article/3038.htm" title="转:MyBatis Generator 详解" target="_blank">转:MyBatis Generator 详解</a> <span class="text-muted">happyqing</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>  MyBatis Generator 详解 http://blog.csdn.net/isea533/article/details/42102297   MyBatis Generator详解 http://git.oschina.net/free/Mybatis_Utils/blob/master/MybatisGeneator/MybatisGeneator.</div> </li> <li><a href="/article/3165.htm" title="让程序员少走弯路的14个忠告" target="_blank">让程序员少走弯路的14个忠告</a> <span class="text-muted">jingjing0907</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E5%88%92/1.htm">计划</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>  无论是谁,在刚进入某个领域之时,有再大的雄心壮志也敌不过眼前的迷茫:不知道应该怎么做,不知道应该做什么。下面是一名软件开发人员所学到的经验,希望能对大家有所帮助   1.不要害怕在工作中学习。 只要有电脑,就可以通过电子阅读器阅读报纸和大多数书籍。如果你只是做好自己的本职工作以及分配的任务,那是学不到很多东西的。如果你盲目地要求更多的工作,也是不可能提升自己的。放</div> </li> <li><a href="/article/3292.htm" title="nginx和NetScaler区别" target="_blank">nginx和NetScaler区别</a> <span class="text-muted">流浪鱼</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a> <div>NetScaler是一个完整的包含操作系统和应用交付功能的产品,Nginx并不包含操作系统,在处理连接方面,需要依赖于操作系统,所以在并发连接数方面和防DoS攻击方面,Nginx不具备优势。 2.易用性方面差别也比较大。Nginx对管理员的水平要求比较高,参数比较多,不确定性给运营带来隐患。在NetScaler常见的配置如健康检查,HA等,在Nginx上的配置的实现相对复杂。 3.策略灵活度方</div> </li> <li><a href="/article/3419.htm" title="第11章 动画效果(下)" target="_blank">第11章 动画效果(下)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3546.htm" title="FAQ - SAP BW BO roadmap" target="_blank">FAQ - SAP BW BO roadmap</a> <span class="text-muted">blueoxygen</span> <a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/BW/1.htm">BW</a> <div>http://www.sdn.sap.com/irj/boc/business-objects-for-sap-faq   Besides, I care that how to integrate tightly.   By the way, for BW consultants, please just focus on Query Designer which i</div> </li> <li><a href="/article/3673.htm" title="关于java堆内存溢出的几种情况" target="_blank">关于java堆内存溢出的几种情况</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a> <div>【情况一】:    java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;   如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:   <jvm-arg>-Xms3062m</jvm-arg>   <jvm-arg>-Xmx</div> </li> <li><a href="/article/3800.htm" title="Manifest.permission_group权限组" target="_blank">Manifest.permission_group权限组</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/Permission/1.htm">Permission</a> <div>结构 继承关系 public static final class Manifest.permission_group extends Object java.lang.Object android. Manifest.permission_group 常量 ACCOUNTS 直接通过统计管理器访问管理的统计 COST_MONEY可以用来让用户花钱但不需要通过与他们直接牵涉的权限 D</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>