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/1946583187232714752.htm" title="基于pyQt5为前端实现的智能座椅控制系统,集成了人脸识别、语音合成和座椅记忆功能,为用户提供个性化的座椅调节体验,后期可连接智能座椅。" target="_blank">基于pyQt5为前端实现的智能座椅控制系统,集成了人脸识别、语音合成和座椅记忆功能,为用户提供个性化的座椅调节体验,后期可连接智能座椅。</a> <span class="text-muted">渴死的鱼仔</span> <a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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> <div>智能座椅控制系统:基于PyQt5的个性化解决方案界面描述:一、系统概述基于PyQt5开发的智能座椅控制系统,深度融合人脸识别、语音交互与座椅记忆功能,打造个性化舒适体验。系统通过实时用户识别自动调节座椅参数,后期可无缝对接智能座椅硬件,实现"无感式"智能生活场景。二、核心功能模块1.人脸识别引擎高精度识别:基于Dlib库实现亚毫米级人脸特征提取动态管理:支持多人脸特征存储与实时匹配快速响应:毫秒级</div> </li> <li><a href="/article/1946571459635769344.htm" title="Anime.js的cleanInlineStyles用法" target="_blank">Anime.js的cleanInlineStyles用法</a> <span class="text-muted"></span> <div>第一章:动画的“身后事”——我们为什么需要清理样式?在深入探讨cleanInlineStyles这个具体的工具函数之前,理解它所要解决的根本问题至关重要。这个问题源于JavaScript动画库的核心工作机制,尤其是像Anime.js这样直接与DOM(文档对象模型)交互的库。1.1Anime.js的工作原理:内联样式的魔法与诅咒Anime.js的强大之处在于其能够以极高的性能和灵活性来驱动网页动画1</div> </li> <li><a href="/article/1946570702161244160.htm" title="【自动化从入门到进阶】Playwright 实战指南,提升测试效率必修课!" target="_blank">【自动化从入门到进阶】Playwright 实战指南,提升测试效率必修课!</a> <span class="text-muted">朱公子的Note</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Playwright/1.htm">Playwright</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a> <div>你是否也有过“页面点击没反应,接口明明没问题”的糟心经历?就算写再多单元测试,也无法覆盖复杂的用户交互。而Playwright的出现,正为前端开发者和QA带来一剂“提效良方”:跨浏览器、强校验、自动重试、不再依赖Selenium!在2025年的软件开发浪潮中,Web应用的复杂性和用户期望持续攀升,单页应用(SPA)和跨浏览器兼容性让测试变得更加关键。想象一下,您的电商平台上线后因未发现的UI错误导</div> </li> <li><a href="/article/1946567043272732672.htm" title="网盘项目实现GitHub第三方登录" target="_blank">网盘项目实现GitHub第三方登录</a> <span class="text-muted">dhdjfj</span> <a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>用户访问/main/files↓路由守卫检查(未登录)↓重定向到/login?redirectUrl=/main/files↓用户点击GitHub登录↓callbackUrl="/main/files"传给后端↓后端保存到session[state]="/main/files"↓GitHub授权完成↓后端取出session[state]="/main/files"↓返回给前端callbackUrl</div> </li> <li><a href="/article/1946566159650320384.htm" title="Anime.js 超级炫酷的网页动画库详解" target="_blank">Anime.js 超级炫酷的网页动画库详解</a> <span class="text-muted">伍哥的传说</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%BA%90%E7%A0%81%E5%88%86%E4%BA%AB/1.htm">前端源码分享</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</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/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/anime.js/1.htm">anime.js</a><a class="tag" taget="_blank" href="/search/timeline/1.htm">timeline</a><a class="tag" taget="_blank" href="/search/animate/1.htm">animate</a> <div>简介Anime.js是一个轻量级的JavaScript动画库,它提供了简单而强大的API来创建各种复杂的动画效果。以下是Anime.js的主要使用方法和特性:安装npminstallanimejs示例基本用法import{animate,createScope,createSpring,createDraggable}from"animejs";import{useEffect,useRef,us</div> </li> <li><a href="/article/1946564521988517888.htm" title="【实操】信息安全工程师系列-第22关 网站安全需求分析与安全保护工程" target="_blank">【实操】信息安全工程师系列-第22关 网站安全需求分析与安全保护工程</a> <span class="text-muted">披荆斩棘的GG</span> <a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>【实操】信息安全工程师系列-第22关网站安全需求分析与安全保护工程********永远不要信任用户输入。—安全编程格言一、网站安全基础概念与威胁分(一)核心定义**网站安全目标:**保障机密性(数据不泄露)、完整性(数据不被篡改)、可用性(服务不中断)和可控性(管理可控制)。**技术架构:**基于B/S架构,涉及网络通信、操作系统、数据库、Web服务器(如Apache、IIS)、Web应用及相关协</div> </li> <li><a href="/article/1946563010814341120.htm" title="前端 Vue.js 动画效果实现技巧" target="_blank">前端 Vue.js 动画效果实现技巧</a> <span class="text-muted">大厂前端小白菜</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</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/ai/1.htm">ai</a> <div>前端Vue.js动画效果实现技巧关键词:Vue.js、动画、过渡、CSS动画、JavaScript动画、性能优化、交互设计摘要:本文将深入探讨Vue.js中实现动画效果的多种技巧,从基础的CSS过渡到复杂的JavaScript动画,涵盖过渡组件使用、动画性能优化、第三方库集成等实用内容。通过丰富的代码示例和实际案例,帮助开发者掌握在Vue应用中创建流畅、吸引人的动画效果。背景介绍目的和范围本文旨在</div> </li> <li><a href="/article/1946552045066579968.htm" title="前后端分离场景下的用户登录玩法&Sa-token框架使用" target="_blank">前后端分离场景下的用户登录玩法&Sa-token框架使用</a> <span class="text-muted"></span> <div>两种方案的token、用户登录信息都存储在redis中!!方案一该方案是前端把token和token有效期一起加密存储到浏览器的localStorage中,每次请求时调用前端的getTokenIsExpiry()获取token并检查token是否过期,过期则remove并跳转登录页,这样前端有个问题就是前端也要知道token的有效期,需要和后端的token有效期保持一致,而后端则提供两个拦截器,分</div> </li> <li><a href="/article/1946549853144281088.htm" title="王财贵:发起读经教育的初心" target="_blank">王财贵:发起读经教育的初心</a> <span class="text-muted">dcfac6b15823</span> <div>编者按:本文节录自季谦先生《学》、《只要你明白》两场演讲及《走在时代前端的教育》一文的相关内容,均已经先生修订定稿,题目「我的读书经历及读经推广之初心」为编者所拟。又按(季谦先生按语)前几天我在交流网上发表的一段话或可作为二十年的总结与后续的愿望:读经人在心志上,既本于尊重经典,且长期受经典之熏陶,必有经典的意识,即能开放心胸,赏识同侪,涵纳异见,相观而善,敦厚笃实,单纯宽简,不忘初心,从容中道。</div> </li> <li><a href="/article/1946549148090167296.htm" title="前端:优秀架构的坟墓" target="_blank">前端:优秀架构的坟墓</a> <span class="text-muted"></span> <div>你是否曾经见过那个设计精良的后端系统——界限分明、模式优雅、抽象层层递进——让人不禁感叹,这一定是极致享受的工作环境?然后,你打开了前端代码。顿时,你陷入了全局状态的迷宫,深度嵌套的组件,半途而废的Hooks,以及用十七种挫败方言“喊叫”的CSS之中。优秀的架构一路走过后端,经过DevOps的打磨,成功在云端扩展……却在React的某个上下文里因为一个下拉菜单绊倒,彻底崩溃。我干这一行够久了,见过</div> </li> <li><a href="/article/1946548009353408512.htm" title="Day04_C语言网络编程20250716_sql语言大全" target="_blank">Day04_C语言网络编程20250716_sql语言大全</a> <span class="text-muted">liujing10232929</span> <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/1.htm">C语言网络编程</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>linux中sql语法大全:MYSQL数据库什么是数据库:关系型数据管理系统数据库的结构层次:数据库文件(后缀名.db)->表单->字段->存储的数据数据库里面针对数据的所有操作,都需要使用指令去实现MYSQL数据库特点:特别适合web的环境,和PHP结合非常好低版本的MYSQL依旧是开源软件,适合用来做二次开发先安装一下mysql安装前,检测是否安装了mysql:rpm–qa|grepmysql</div> </li> <li><a href="/article/1946533329478152192.htm" title="【Vue CLI】手把手教你撸插件" target="_blank">【Vue CLI】手把手教你撸插件</a> <span class="text-muted">vivo互联网技术</span> <div>本文首发于vivo互联网技术微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing现如今Vue作为主流的前端框架之一,其健全的配套工具,活跃的开源社区,让广发码农热衷追捧。VueCLI作为其官方的开发构建工具,目前已更新迭代到4.x版本,其内部集成了日常开发用到的打包压缩等功能,简化了常规自己动手配置webpack的烦</div> </li> <li><a href="/article/1946532883476836352.htm" title="C#与Web开发:ASP.NET Core MVC框架" target="_blank">C#与Web开发:ASP.NET Core MVC框架</a> <span class="text-muted">墨瑾轩</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6%E5%AD%A6C%23%E3%80%90%E4%B8%80%E3%80%91/1.htm">一起学学C#【一】</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a> <div>关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣引言嗨,小伙伴们!今天我们要聊的是一个超级有趣的主题——ASP.NETCoreMVC。如果你对C#还不熟悉,那么可以把它想象成一种既强大又灵活的语言,适合用来编写各种各样的应用程序。而ASP.NETCoreMVC呢?它是一种基于C#的现代Web开发框架,能够帮</div> </li> <li><a href="/article/1946531239762653184.htm" title="react native学习record one month" target="_blank">react native学习record one month</a> <span class="text-muted">jjjjjjjjj¢</span> <a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>ReactNative开发主要面向“跨平台原生App开发”一、基础能力JavaScript/TypeScript•熟练掌握ES6+(async/await、Promise、Map、Set等)•熟悉TypeScript类型系统(常用类型定义、接口、联合类型、泛型)React核心•函数组件+Hook(useState、useEffect、useCallback、useRef等)•状态管理(Contex</div> </li> <li><a href="/article/1946531240354050048.htm" title="Java Script学习笔记(1)" target="_blank">Java Script学习笔记(1)</a> <span class="text-muted">MERRYME2</span> <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>JavaScript学习笔记(1)(课程:黑马程序员)JavaScript是什么JavaScript是世界最流行的语言之一,是一种运行在客户端的脚本语言(Script是脚本的意思)脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行现在也可以基于Node.js技术进行服务器端编程JS的组成ECMAScript(JavaScript语法)和DOM(页面文档对象)和BOM(浏览</div> </li> <li><a href="/article/1946528593140051968.htm" title="云原生环境里Nginx的故障排查思路" target="_blank">云原生环境里Nginx的故障排查思路</a> <span class="text-muted">AI云原生与云计算技术学院</span> <a class="tag" taget="_blank" href="/search/AI%E4%BA%91%E5%8E%9F%E7%94%9F%E4%B8%8E%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">AI云原生与云计算</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>云原生环境里Nginx的故障排查思路关键词:云原生、Nginx、故障排查、容器化、Kubernetes摘要:本文聚焦于云原生环境下Nginx的故障排查思路。随着云原生技术的广泛应用,Nginx作为常用的高性能Web服务器和反向代理服务器,在容器化和编排的环境中面临着新的故障场景和挑战。文章首先介绍云原生环境及Nginx的相关背景知识,接着阐述核心概念和联系,详细讲解故障排查的核心算法原理与操作步骤</div> </li> <li><a href="/article/1946528088854687744.htm" title="Java-Script学习笔记-1" target="_blank">Java-Script学习笔记-1</a> <span class="text-muted">许我写余生ღ</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</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>文章目录前言JavaScript基本介绍一、js的嵌入方法内嵌式外链式行内式二、js简单语法语句注释变量JavaScript保留关键字三、JavaScript作用域Javascrpt局部变量JavaScript全局变量四、运算符算术运算符比较运算符赋值运算符逻辑运算符五、JavaScript数据类型JavaScript如何判断数据类型数字类型(Number)字符串型(string)布尔类型(boo</div> </li> <li><a href="/article/1946526702121316352.htm" title="利用Python实现QQ实时到账 免签支付 原创" target="_blank">利用Python实现QQ实时到账 免签支付 原创</a> <span class="text-muted">0xdF</span> <a class="tag" taget="_blank" href="/search/Python%E5%AD%A6%E4%B9%A0/1.htm">Python学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>原创转载请注明出处核心部分:解决QQ的登录验证问题主要利用python的selenium库和QQ的快速登录实现登录网页再利用抓到的json来输出今日的订单情况直接上代码importrequestsimporttimeimportosfromseleniumimportwebdriverimportsysimportshutilimportjson'''注意:要实现QQ钱包实时到账需要在服务器上登录</div> </li> <li><a href="/article/1946517375918600192.htm" title="java Script笔记" target="_blank">java Script笔记</a> <span class="text-muted"></span> <div>第一章,初始javascript1,javascript的基本概念JavaScript一种直译式脚本语言,一种基于对象和事件驱动并具有安全性的客户端脚本语言;也是一种广泛应用客户端web开发的脚本语言。简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。2,Javascript的特点解释性的脚本语言(代码不进行预编译)与其他脚本语言一样,JavaScript也是一种解释性语言,它</div> </li> <li><a href="/article/1946516239912333312.htm" title="告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践" target="_blank">告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践</a> <span class="text-muted">码力无边-OEC</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>告别项目混乱:基于pnpm+Turborepo的现代化Monorepo工程化最佳实践随着前端项目日益复杂,团队规模不断扩大,我们正面临一个棘手的问题:项目间的代码复用、依赖管理和构建流程变得越来越混乱。传统的“一个项目一个仓库”(Polyrepo)模式,导致了严重的“轮子”重复制造、版本不一致和协作效率低下。是时候引入一种更先进的组织方式了:Monorepo。它并不是一个新概念,Google、Fa</div> </li> <li><a href="/article/1946516113709920256.htm" title="前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战" target="_blank">前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战</a> <span class="text-muted"></span> <div>前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战当你的页面加载时间超过3秒时,用户的跳出率会飙升到40%以上。而在所有的前端性能优化手段中,图片优化无疑是投入产出比最高的一环。一张未经优化的巨大图片,就足以让你的所有努力付诸东流。然而,很多开发者对图片优化的理解还停留在“压缩一下JPG”的阶段。实际上,我们已经进入了一个由WebP和AVIF主导的新时代。这两种新一代</div> </li> <li><a href="/article/1946515861590306816.htm" title="深入理解 Vue 3 中的 emit" target="_blank">深入理解 Vue 3 中的 emit</a> <span class="text-muted"></span> <div>深入理解Vue3中的emit在Vue3中,组件通信是开发中非常重要的一部分,其中通过emit实现父子组件通信是最常见的方式之一。emit的作用是:子组件可以通过触发自定义事件将数据传递给父组件。在本篇文章中,我们将从以下几个方面详细讲解emit的使用:基础概念使用方法与语法配合props实现完整的父子通信在TypeScript中的类型推断注意事项与最佳实践一、基础概念什么是emit?emit是Vu</div> </li> <li><a href="/article/1946515735283036160.htm" title="CSS中隐藏滚动条的同时保留滚动功能" target="_blank">CSS中隐藏滚动条的同时保留滚动功能</a> <span class="text-muted">码力无边-OEC</span> <a class="tag" taget="_blank" href="/search/HTML%2BCSS/1.htm">HTML+CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E5%BC%80%E5%8F%91/1.htm">网页开发</a> <div>在CSS中,我们可以通过一些技巧来隐藏滚动条,同时保留滚动功能。以下是几种常用的方法和具体的实现步骤。1.使用overflow和::-webkit-scrollbar这种方法适用于大多数现代浏览器。通过设置overflow属性启用滚动,同时利用::-webkit-scrollbar来隐藏滚动条(此伪元素只适用于WebKit内核的浏览器,如Chrome和Safari)。实现步骤:/*隐藏滚动条,启用</div> </li> <li><a href="/article/1946514978794172416.htm" title="【JS笔记】Java Script学习笔记" target="_blank">【JS笔记】Java Script学习笔记</a> <span class="text-muted"></span> <div>JavaScript输出语句document.write():将内容写入html文档console.log():将内容写入控制台alert():弹窗变量JS是弱类型语言,变量无类型var:全局变量,可重复声明let:局部变量,不可重复声明const:常量,不可重复声明数据类型number:数字。整数、浮点数、NaNstring:字符串。单引号:'Hello'双引号:"Hello"模板字符串:使用反</div> </li> <li><a href="/article/1946514473791582208.htm" title="ASP .NET Core 8实现实时Web功能" target="_blank">ASP .NET Core 8实现实时Web功能</a> <span class="text-muted">发粪的屎壳郎</span> <a class="tag" taget="_blank" href="/search/ASP/1.htm">ASP</a><a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/Core/1.htm">Core</a><a class="tag" taget="_blank" href="/search/8%E5%90%8E%E7%AB%AF%E6%9C%8D%E5%8A%A1%E6%A1%86%E6%9E%B6%E6%90%AD%E5%BB%BA/1.htm">8后端服务框架搭建</a><a class="tag" taget="_blank" href="/search/asp/1.htm">asp</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/core/1.htm">core</a><a class="tag" taget="_blank" href="/search/8/1.htm">8</a><a class="tag" taget="_blank" href="/search/signalr/1.htm">signalr</a> <div>ASP.NETCoreSignalR是一个开放源代码库,可用于简化向应用添加实时Web功能。实时Web功能使服务器端代码能够将内容推送到客户端。以下是ASP.NETCoreSignalR的一些主要功能:自动处理连接管理同时向所有连接的客户端发送消息。例如聊天室向特定客户端或客户端组发送消息SignalR支持以下用于处理实时通信的技术(按正常回退的顺序):WebSocketServer-Sent事件</div> </li> <li><a href="/article/1946507798388994048.htm" title="js运行,控制台显示乱码" target="_blank">js运行,控制台显示乱码</a> <span class="text-muted">wangsrc</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>"code-runner.executorMap":{  "javascript":"C:\\ProgramFiles\\nodejs\\node.exe"   //node.js的安装路径}参考文章:https://blog.csdn.net/m0_63785629/article/details/129432129</div> </li> <li><a href="/article/1946506662605025280.htm" title="小架构step系列14:白盒集成测试原理" target="_blank">小架构step系列14:白盒集成测试原理</a> <span class="text-muted">秋千码途</span> <a class="tag" taget="_blank" href="/search/%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95/1.htm">集成测试</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>1概述这里的白盒测试是指开发编写测试代码来进行测试,集成测试是指从Controller开始对http接口调用的整个流程进行测试。这个流程就是对一个http请求的响应流程,正常运行的时候是通过springboot内嵌的tomcat来启动一个webserver来监听http请求,然后响应该http请求。在测试的时候,如果也需要启动一个webserver来监听请求,那么测试就更加困难了一些。还好spri</div> </li> <li><a href="/article/1946502499275960320.htm" title="vue 不同版本下v-model的底层实现" target="_blank">vue 不同版本下v-model的底层实现</a> <span class="text-muted"></span> <div>下面把「底层实现」和「差异」拆开讲,先给代码级流程,再给一个对照表,面试或源码阅读都能直接用。一、底层实现(编译→运行时的两条链路)Vue2•编译阶段:模板编译器遇到v-model,根据元素类型生成不同的AST指令对象。•运行时指令:src/platforms/web/compiler/directives/model.js里的model()函数把指令对象转成原生标签addProp(el,'val</div> </li> <li><a href="/article/1946499472943017984.htm" title="js 记录七 vscode+iis中文乱码" target="_blank">js 记录七 vscode+iis中文乱码</a> <span class="text-muted">WMY10001</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1.其实就是html没有加2.其他配置的话,iis>.net全球化>文件utf-83.iis的localhost文件夹里的web.config,修改为:4.vscode右下角utf-85.点击vscode右下角utf-8,选择通过编码保存其实试了就第一条有效</div> </li> <li><a href="/article/1946495945516576768.htm" title="【jquery详细讲解】" target="_blank">【jquery详细讲解】</a> <span class="text-muted">ᝰ落念英</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/jQuery/1.htm">jQuery</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>(一)、什么是jQueryjQuery是对javascript的一种封装--js的函数库。用于客户端的开发,由美国人在2001年1月推出。(二)、jQuery与javascript的区别:1、本质上的区别:jQuery是一个函数库,基于js语言编写出来的框架,实质上还是属于js。2、代码书写不同,jq更简单。3、使用方法不同:使用jQuery和javascript分别加载DOM,js只执行一次,j</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>