react性能优化

刚开始写react可能只是写出来完成业务就完了,后期审查代码发现可能很多地方其实都可以优化,之前可能有些地方似是而非,在此小结一下。

一些概念

Virtual DOM

react引入了一个叫做虚拟DOM的概念,安插在JavaScript逻辑和实际的DOM之间。这一概念提高了Web性能。在UI渲染过程中,React通过在虚拟DOM中的微操作来实对现实际DOM的局部更新。

在Web开发中,我们总需要将变化的数据实时反应到UI上,这时就需要对DOM进行操作。而复杂或频繁的DOM操作通常是性能瓶颈产生的原因,React为此引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DOM API。基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个DOM树,然后React将当前整个DOM树和上一次的DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。而且React能够批处理虚拟DOM的刷新,在一个事件循环(Event Loop)内的两次数据变化会被合并,例如你连续的先将节点内容从A变成B,然后又从B变成A,React会认为UI不发生任何变化,而如果通过手动控制,这种逻辑通常是极其复杂的。尽管每一次都需要构造完整的虚拟DOM树,但是因为虚拟DOM是内存数据,性能是极高的,而对实际DOM进行操作的仅仅是Diff部分,因而能达到提高性能的目的。这样,在保证性能的同时,开发者将不再需要关注某个数据的变化如何更新到一个或多个具体的DOM元素,而只需要关心在任意一个数据状态下,整个界面是如何Render的。

render

react的组件渲染分为初始化渲染和更新渲染。

  • 初始化渲染
    • 在初始化渲染的时候会调用根组件下的所有组件的render方法进行渲染
  • 更新渲染
    • 当我们要更新某个子组件的时候,我们期待的是只变化需要变化的组件,其他组件保持不变。
    • 但是,react的默认做法是调用所有组件的render,再对生成的虚拟DOM进行对比,如不变则不进行更新。这样的render和虚拟DOM的对比明显是在浪费

Chrome Performance

在开发模式下, 在支持的浏览器内使用性能工具可以直观的了解组件何时挂载,更新和卸载

  • 打开Chrome开发工具Performance 标签页点击Record
  • 执行你想要分析的动作。不要记录超过20s,不然Chrome可能会挂起。
  • 停止记录。
  • React事件将会被归类在 User Timing标签下。


    1.png

优化

bind函数

绑定this的方式:一般有下面几种方式

  • constructor中绑定
constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this); //构造函数中绑定
}
//然后可以

  • 使用时绑定

  • 箭头函数

{ this.handleClick() }}>

  • 哪个好呢
    • 答案是第一种方式。
    • 因为第一种,构造函数每一次渲染的时候只会执行 一遍;
    • 而第二种方法,在每次render()的时候都会重新执行一遍函数;
    • 第三种方法的话,每一次render()的时候,都会生成一个新的箭头函数

shouldComponentUpdate

shouldComponentUpdate是决定react组件什么时候能够不重新渲染的函数,返回true时更新,false时不更新。默认返回true,即每次重新渲染,因此我们可以重写个函数从而达到"个性化定制更新"的效果。

  • 栗子
class Title extends React.Component {
  constructor(props) {
    super(props)
  }
  render() {
    console.log('title render')
    return (
      
{this.props.title}
) } } class PureCom extends React.Component { constructor(props) { super(props) this.state = { title: 'pure', num: 0 } this.add = this.add.bind(this); } add() { let { num } = this.state; num++; this.setState({ num }) } render() { console.log('pure render') return (
<p>{this.state.num}</p> <button onClick={this.add}>add</button> </div> ) } } </code></pre> <ul> <li>现在每次点击add按钮,父组件state的num都会+1,而title是一直不变的,通过console我们却发现,Title组件也在一直render,这就是因为shouldComponentUpdate默认返回true的,也就是父组件更新之后,子组件也会更新。</li> <li>然后子组件是没必要更新的,所以我们重写下shouldComponentUpdate方法</li> </ul> <pre><code class="js">class Title extends React.Component { constructor(props) { super(props) } shouldComponentUpdate(nextProps, nextState) { if (nextProps.title != this.props.title) { return true //只有title变化时才更新 } else { return false } } render() { console.log('title render') return ( <div>{this.props.title}</div> ) } } </code></pre> <ul> <li>现在就对了,点击父组件的add按钮并没有触发Title组件的更新。</li> </ul> <h2>PureComponent</h2> <blockquote> <p>类似上面的情况其实我们经常遇到,因此react提供了PureComponent来解决类似的问题,可以让我们少写许多的shouldComponentUpdate。</p> </blockquote> <pre><code class="js">class Title extends React.PureComponent { constructor(props) { super(props) } render() { console.log('title render') return ( <div>{this.props.title}</div> ) } } </code></pre> <ul> <li>用了PureComponent之后作用和之前是相同的。</li> <li>原理:当组件更新时,如果组件的 props 和 state 都没发生改变, render 方法就不会触发,省去 Virtual DOM 的生成和比对过程,达到提升性能的目的。具体就是 React 自动帮我们做了一层<strong>浅比较</strong>:</li> </ul> <pre><code class="js">if (this._compositeType === CompositeTypes.PureClass) { shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState); } </code></pre> <h2>突变的数据</h2> <blockquote> <p>大多数情况PureComponent都可以解决,但是之前也说过,他是“浅比较”,如果遇到数据结构比较复杂,他是无法识别的。</p> </blockquote> <pre><code class="js">class PureCom extends PureComponent { constructor(props) { super(props) this.state = { items: [1, 2, 3], title: 'pure', } this.add = this.add.bind(this); } add() { let { items } = this.state; items.push(23); this.setState({ items }) } render() { console.log('pure render') return ( <div> <Title title={this.state.title} /> <ul> {this.state.items.map((e, i) => { return <li key={i}>{e}</li> })} </ul> <button onClick={this.add}>add</button> </div> ) } } </code></pre> <ul> <li>点击add,你会发现没有任何反应,为什么呢?因为你setState的<code>items</code>其实是和<code>state里面的items</code>指向相同引用。原理和下面一样。</li> </ul> <pre><code class="js">let a={val:1}; let b=a; b.val=2; console.log(a)//{val:2} console.log(b)//{val:2} </code></pre> <ul> <li>解决办法 <ul> <li>1.深拷贝</li> </ul> <pre><code class="js">add() { let items =JSON.parse(JSON.stringify(this.state.items));//黑科技 //或者let items=deepCopy(this.state.items); items.push(23); this.setState({ items }) } </code></pre> <ul> <li>2.数组使用concat,对象使用Object.assign()</li> </ul> <pre><code class="js">add() { let { items } = this.state; items=items.concat(23) //此时的items是一个新数组 this.setState({ items }) } </code></pre> <ul> <li>3.使用不可变数据Immutable.js</li> </ul> <pre><code class="js">add() { let { items } = this.state; items = update(items, { $push: [23] }); this.setState({ items }) } </code></pre> <ul> <li>其中深拷贝如果数据比较复杂消耗会比较大</li> <li>concat,Object.assign用起来很快捷</li> <li>如果你数据比较复杂,可能Immutable会是最好的选择。官方推荐::seamless-immutable 和immutability-helper。</li> </ul> </li> </ul> <h2>redux</h2> <p>个人感觉redux的渲染机制也是和PureComponent类似的,都是浅比较,因此上面的3种解决办法也适用于redux.</p> <h2>16.3+ new API</h2> <blockquote> <p>一些生命周期会被删除,将在17.0:删除componentWillMount,componentWillReceiveProps和componentWillUpdate。</p> </blockquote> <ul> <li>一些变化 <ul> <li> <code>componentWillMount</code> => <code>componentDidMount</code> </li> <li> <code>componentWillReceiveProps</code> => <code>getDerivedStateFromProps</code> </li> <li> <code>componentWillUpdate</code> => <code>getSnapshotBeforeUpdate</code> </li> </ul> </li> <li>static getDerivedStateFromProps</li> </ul> <pre><code class="js">//代替componentWillReceiveProps,因为是静态方法,不能访问到 this,避免了一些可能有副作用的逻辑,比如访问 DOM 等等 //会在第一次挂载和重绘的时候都会调用到,因此你基本不用在constructor里根据传入的props来setState static getDerivedStateFromProps(nextProps, prevState) { console.log(nextProps, prevState) if (prevState.music !== nextProps.music) { return { music: nextProps.music, music_file: music_file, index:prevState.index+1 }; //document.getElementById('PLAYER').load(); //这里不对,应该放在getSnapshotBeforeUpdate 和 componentDidUpdate } return null; } getSnapshotBeforeUpdate(prevProps, prevState) { if (this.state.music != prevState.music) { //进行aduio的重载 return true } return null; } componentDidUpdate(prevProps, prevState, snapshot) { if (snapshot !== null) { document.getElementById('PLAYER').load(); //重载 } } </code></pre> <ul> <li>getSnapshotBeforeUpdate</li> </ul> <pre><code class="js">//新的getSnapshotBeforeUpdate生命周期在更新之前被调用(例如,在DOM被更新之前)。此生命周期的返回值将作为第三个参数传递给componentDidUpdate。 (这个生命周期不是经常需要的,但可以用于在恢复期间手动保存滚动位置的情况。) class ScrollingList extends React.Component { constructor(props) { super(props); this.listRef = React.createRef(); } getSnapshotBeforeUpdate(prevProps, prevState) { // Are we adding new items to the list? // Capture the scroll position so we can adjust scroll later. if (prevProps.list.length < this.props.list.length) { const list = this.listRef.current; return list.scrollHeight - list.scrollTop; } return null; } componentDidUpdate(prevProps, prevState, snapshot) { //snapshot // If we have a snapshot value, we've just added new items. // Adjust scroll so these new items don't push the old ones out of view. // (snapshot here is the value returned from getSnapshotBeforeUpdate) if (snapshot !== null) { const list = this.listRef.current; list.scrollTop = list.scrollHeight - snapshot; } } render() { return ( <div ref={this.listRef}>{/* ...contents... */}</div> ); } } </code></pre> <ul> <li>使用componentDidMount 代替 componentWillMount</li> </ul> <pre><code class="js"> //有一个常见的错误观念认为,在componentWillMount中提取可以避免第一个空的渲染。在实践中,这从来都不是真的,因为React总是在componentWillMount之后立即执行渲染。如果数据在componentWillMount触发的时间内不可用,则无论你在哪里提取数据,第一个渲染仍将显示加载状态。 // After class ExampleComponent extends React.Component { state = { externalData: null, }; componentDidMount() { this._asyncRequest = asyncLoadData().then( externalData => { this._asyncRequest = null; this.setState({ externalData }); } ); } componentWillUnmount() { if (this._asyncRequest) { this._asyncRequest.cancel(); } } render() { if (this.state.externalData === null) { // Render loading state ... } else { // Render real UI ... } } } </code></pre> <h2>其他</h2> <ul> <li>props尽量只传需要的数据,避免多余的更新</li> <li>组件尽量解耦,比如一个input+list组建,可以将list分成一个PureComponent,只在list数据变化是更新</li> <li>如果组件有复用,key值非常重要。因此key的优化,如果有唯一id,尽量不使用循环得到的index</li> <li>暂时这些</li> </ul> <h3>最后</h3> <blockquote> <p>大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……<br> 个人博客:www.yangyuetao.cn<br> 小程序:TaoLand</p> </blockquote> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1705990777169063936"></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">你可能感兴趣的:(react性能优化)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1903970021751713792.htm" title="前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二)" target="_blank">前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二)</a> <span class="text-muted">大泡泡糖</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">学习记录</a><a class="tag" taget="_blank" href="/search/reactjs/1.htm">reactjs</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/webstorm/1.htm">webstorm</a> <div>前端技术学习记录:react+dvajs+antdesign实现暴走计算器的页面重构(二)前言定义Modelconnect起来更新state拥抱变化主题切换更换页面获取当前设备类型编写武学选择前言www定义Model完成UI后,现在开始处理数据和逻辑。dva通过model的概念把一个领域的模型管理起来,包含同步更新state的reducers,处理异步逻辑的effects,订阅数据源的subscr</div> </li> <li><a href="/article/1903967375003283456.htm" title="React Router使用方法" target="_blank">React Router使用方法</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/react.js/1.htm">react.js</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%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>目录简介ReactRouter的三种使用模式声明模式数据模式框架模式ReactRouter7声明模式使用方法在入口文件引入BrowserRouter配置一个路由组件管理路由将路由组件引入App.tsx嵌套路由链接式路由导航\和\编程式路由导航简介ReactRouter是React的多策略路由器。在React应用中最新的ReactRouter7有三种使用模式,分别是声明模式、数据模式、框架模式。从声</div> </li> <li><a href="/article/1903966995238416384.htm" title="使用vite+react+ts+Ant Design开发后台管理项目(五)" target="_blank">使用vite+react+ts+Ant Design开发后台管理项目(五)</a> <span class="text-muted">吕彬-前端</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前言本文将引导开发者从零基础开始,运用vite、react、react-router、react-redux、AntDesign、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术工具,从项目构思到最终实现的全过程,提供清晰的开发思路和实用的技术应用技巧。项目gitee地址:lbking666</div> </li> <li><a href="/article/1903955773470339072.htm" title="React性能优化的8种方式" target="_blank">React性能优化的8种方式</a> <span class="text-muted">Mr.BoBo.</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1、Reac.memo缓存组件2、使用useMemo缓存大量的计算3、避免使用内联对象4、避免使用匿名函数5、延迟加载不是立即需要的组件6、调整CSS而不是强制组件加载和卸载7、使用React.Fragment避免添加额外的DOM8、使用React.PureComponent,shouldComponentUpdate9、</div> </li> <li><a href="/article/1903955268501303296.htm" title="React状态管理" target="_blank">React状态管理</a> <span class="text-muted">她的双马尾</span> <a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>状态管理概念状态管理是指如何高效地管理和共享组件中的状态。React提供了useState和useReducer来管理本地状态,而对于全局状态,可以使用ContextAPI或第三方库(如Redux)。用法本地状态:使用useState或useReducer。全局状态:使用ContextAPI或Redux。使用场景本地状态:组件内部的状态,如表单输入、按钮点击。全局状态:需要跨组件共享的状态,如用户</div> </li> <li><a href="/article/1903954135003230208.htm" title="【React】List使用QueueAnim动画效果不生效——QueueAnim与函数组件兼容性问题" target="_blank">【React】List使用QueueAnim动画效果不生效——QueueAnim与函数组件兼容性问题</a> <span class="text-muted">Yvette-W</span> <a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</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%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>版本:“antd-mobile”:“^5.37.1”,“rc-queue-anim”:“^2.0.0”,问题在使用QueueAnim时,如果动画的子元素是AntDesignMobile中的组件(如List.Item),可能会遇到动画不生效的问题,并且会看到类似以下警告:Warning:Functioncomponentscannotbegivenrefs.Attemptstoaccessthisr</div> </li> <li><a href="/article/1903953252483919872.htm" title="OpenStack 云平台的深度定制与性能优化" target="_blank">OpenStack 云平台的深度定制与性能优化</a> <span class="text-muted">算法探索者</span> <a class="tag" taget="_blank" href="/search/openstack/1.htm">openstack</a> <div>引言OpenStack作为一款领先的开源云平台,以其高度的灵活性和可扩展性,为企业构建云计算基础设施提供了强大的支持。然而,不同企业的业务场景和技术需求千差万别,原生的OpenStack部署往往无法完全满足企业特定的要求。因此,对OpenStack云平台进行深度定制,并在此基础上进行性能优化,成为了企业充分发挥OpenStack优势、提升云服务质量的关键。本文将深入探讨如何针对企业特定需求对Ope</div> </li> <li><a href="/article/1903915899207872512.htm" title="使用hel-micro微服务实现在jsp项目中引入react组件" target="_blank">使用hel-micro微服务实现在jsp项目中引入react组件</a> <span class="text-muted">小灰灰学编程</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/hel-micro/1.htm">hel-micro</a> <div>以下是一个完整的示例,涵盖React子应用配置、JSP主应用集成以及样式隔离的实现细节。我们将通过CSSModules和ShadowDOM确保React样式与JSP样式互不干扰。一、React子应用配置1.项目结构react-module/├──src/│├──index.js#模块入口文件│├──App.js#React组件│└──App.module.css#组件样式(CSSModules)├</div> </li> <li><a href="/article/1903909465799847936.htm" title="React的状态管理——Redux" target="_blank">React的状态管理——Redux</a> <span class="text-muted">miraculous111</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Redux与计数器配套工具使用ReactToolkit创建counterStore为React注入storeReact组件使用store中的数据React组件修改store中的数据绑定用户交互效果展示action传参Redux异步状态管理React中的Redux就像Vue中的Vuex和Pinia一样,都是状态管理工具,通过这种方式可以很方便的实现各个组件中的通信。下面的代码是通过Redux实现一个</div> </li> <li><a href="/article/1903906440280600576.htm" title="2021-最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)---React篇" target="_blank">2021-最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)---React篇</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/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%8D%E7%AB%AF/1.htm">大前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a> <div>★★★React事件绑定原理★★★React中的setState缺点是什么呢★★★React组件通信如何实现★★★类组件和函数组件的区别★★★请你说说React的路由是什么?★★★★★React有哪些性能优化的手段?★★★★Reacthooks用过吗,为什么要用?★★★★虚拟DOM的优劣如何?实现原理?★★★★React和Vue的diff时间复杂度从O(n^3)优化到O(n),那么O(n^3)和O</div> </li> <li><a href="/article/1903903151866572800.htm" title="Angular中`trackBy`函数的独特性与性能优化" target="_blank">Angular中`trackBy`函数的独特性与性能优化</a> <span class="text-muted">t0_54program</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%89%8B%E5%86%8C/1.htm">编程问题解决手册</a><a class="tag" taget="_blank" href="/search/angular.js/1.htm">angular.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91/1.htm">个人开发</a> <div>在Angular项目中,优化性能是每一个开发者都需要考虑的问题。特别是在处理大数据量或动态变化的列表时,Angular的trackBy函数成为了我们手中的利器。然而,当我们面对多个列表使用相同trackBy函数时,可能会产生一些疑问:如果这些列表中的项有相同的ID,是否会影响Angular的变更检测?本文将详细探讨trackBy函数在这种情境下的表现及其带来的性能优化。trackBy函数简介tra</div> </li> <li><a href="/article/1903898742252171264.htm" title="深入浅出:序列化与反序列化的全面解析" target="_blank">深入浅出:序列化与反序列化的全面解析</a> <span class="text-muted">进击的小白菜</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E4%BA%9B%E5%BC%80%E5%8F%91%E5%B8%B8%E8%AF%86/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/%E5%BC%80%E5%8F%91%E5%B8%B8%E8%AF%86/1.htm">开发常识</a> <div>文章目录1.引言2.什么是序列化?2.1为什么需要序列化?3.什么是反序列化?3.1反序列化的重要性4.序列化与反序列化的实现4.1JSON(JavaScriptObjectNotation)4.2XML(eXtensibleMarkupLanguage)4.3ProtocolBuffers(Protobuf)4.4MessagePack5.安全性考虑6.性能优化7.结论附录:常见问题解答Q1:什</div> </li> <li><a href="/article/1903873762076454912.htm" title="PHP框架为基础的购物平台设计思路分步骤说明" target="_blank">PHP框架为基础的购物平台设计思路分步骤说明</a> <span class="text-muted">星糖曙光</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF%E8%AF%AD%E8%A8%80%EF%BC%88node/1.htm">后端语言(node</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/vue%E7%AD%89%E7%AD%89%EF%BC%89/1.htm">vue等等)</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>以下是以PHP框架为基础的购物平台设计思路分步骤说明:一、技术选型阶段技术栈={后端框架:Laravel/Yii2(提供ORM、路由、中间件支持)前端框架:Vue.js/React(可选SPA方案)数据库:MySQL8.0+(事务型数据存储)缓存:Redis(会话/商品缓存)队列:RabbitMQ(异步处理订单)\text{技术栈}=\begin{cases}后端框架:Laravel/Yii2(提</div> </li> <li><a href="/article/1903857867765641216.htm" title="计算机网络&性能优化相关内容详解" target="_blank">计算机网络&性能优化相关内容详解</a> <span class="text-muted">GISer_Jinger</span> <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>1.优化页面性能:根据搜索结果,优化可以从资源加载、渲染优化、缓存策略等方面入手。网页1提到合并文件、压缩图片、使用CDN和HTTP/2。网页2和3强调了关键资源划分、减少HTTP请求、代码拆分和预加载。我需要综合这些点,分块回答。2.滚动性能优化及虚拟滚动核心:用户提到虚拟滚动是关键。网页6、8、9、10详细介绍了虚拟滚动的原理,即仅渲染可视区域元素,减少DOM操作。需要总结这些内容,并指出核心</div> </li> <li><a href="/article/1903837441387720704.htm" title="【商城实战(55)】商城数据库备份:策略与实操指南" target="_blank">【商城实战(55)】商城数据库备份:策略与实操指南</a> <span class="text-muted">奔跑吧邓邓子</span> <a class="tag" taget="_blank" href="/search/%E5%95%86%E5%9F%8E%E5%AE%9E%E6%88%98/1.htm">商城实战</a><a class="tag" taget="_blank" href="/search/%E5%95%86%E5%9F%8E%E5%AE%9E%E6%88%98/1.htm">商城实战</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD/1.htm">数据库备份</a><a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/%E7%AD%96%E7%95%A5%E4%B8%8E%E5%AE%9E%E6%93%8D/1.htm">策略与实操</a> <div>【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用uniapp、ElementPlus、SpringBoot搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从0到1的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战</div> </li> <li><a href="/article/1903822687952760832.htm" title="六十天前端强化训练之第二十九天之深入解析:从零构建企业级Vue项目的完整指南" target="_blank">六十天前端强化训练之第二十九天之深入解析:从零构建企业级Vue项目的完整指南</a> <span class="text-muted">编程星辰海</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</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%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/Vue%E9%A1%B9%E7%9B%AE/1.htm">Vue项目</a> <div>=====欢迎来到编程星辰海的博客讲解======看完可以给一个免费的三连吗,谢谢大佬!目录一、Vite核心原理与开发优势二、项目创建深度解析三、配置体系深度剖析四、企业级项目架构设计五、性能优化实战六、开发提效技巧七、质量保障体系八、扩展阅读推荐一、Vite核心原理与开发优势1.1为什么选择Vite?Vite采用现代浏览器原生ES模块系统(NativeESM)作为开发服务器,颠覆了传统打包工具的</div> </li> <li><a href="/article/1903813475482791936.htm" title="中国大陆网站用了lightHouse之后还有必要用WebPageTest么?" target="_blank">中国大陆网站用了lightHouse之后还有必要用WebPageTest么?</a> <span class="text-muted">混血哲谈</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>对于中国大陆的网站,即使已使用Lighthouse进行性能优化,WebPageTest仍有不可替代的价值。两者并非互斥,而是互补工具,适用于不同维度的性能分析。以下是具体原因和场景说明:一、核心结论:Lighthouse与WebPageTest的定位差异工具核心价值适用场景中国大陆场景的局限性Lighthouse提供代码级优化建议(如压缩资源、渲染阻塞修复)本地开发调试、快速生成优化清单仅反映本地</div> </li> <li><a href="/article/1903810320141447168.htm" title="秒开WebView Android性能优化全攻略:深度解析与实战策略" target="_blank">秒开WebView Android性能优化全攻略:深度解析与实战策略</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/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>秒开WebViewAndroid性能优化全攻略:深度解析与实战策略在Android开发中,WebView作为一个重要的组件,用于在应用中嵌入和展示网页内容。然而,WebView的性能往往成为影响用户体验的关键因素之一。实现WebView的“秒开”体验,不仅需要开发者对WebView的工作机制有深入的理解,还需要掌握一系列性能优化策略。本文将从多个维度深入探讨AndroidWebView的性能优化,</div> </li> <li><a href="/article/1903810193775456256.htm" title="如何进行PHP性能优化?" target="_blank">如何进行PHP性能优化?</a> <span class="text-muted">破碎的天堂鸟</span> <a class="tag" taget="_blank" href="/search/PHP%E5%AD%A6%E4%B9%A0/1.htm">PHP学习</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/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>PHP性能优化是一个复杂且多方面的过程,涉及从代码层面到服务器配置的多个方面。以下是一些关键的优化技巧和最佳实践:选择合适的数据结构(如数组、对象等)可以显著提高程序的运行效率。缓存是提升PHP性能的有效手段之一。可以通过页面缓存、数据缓存、内存缓存等方式来减少重复计算。例如,使用APC、Memcached或Redis进行内存缓存,或者利用文件系统进行数据缓存。使用索引、优化SQL查询语句以及使用</div> </li> <li><a href="/article/1903809437764743168.htm" title="前端性能优化-知识点" target="_blank">前端性能优化-知识点</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/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>Web性能优化意义1.减少整体加载时间:减小文件体积、减少HTTP请求、使用预加载。2.使网站尽快可用:仅加载首屏内容,其他内容根据需要进行懒加载。3.平滑和交互性:使用CSS替代JS动画、减少UI重绘。4.加载表现形式:使用加载动画、进度条、骨架屏等过渡信息,让用户感觉到页面加载更快。5.性能监测:性能指标、性能测试、性能监控持续优化等Web性能指标RAIL性能模型Response(响应):快速</div> </li> <li><a href="/article/1903808555442565120.htm" title="JavaScript 性能优化实战:优化循环结构提升效率" target="_blank">JavaScript 性能优化实战:优化循环结构提升效率</a> <span class="text-muted">deying0865423</span> <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> <div>目录一、理解循环的性能损耗二、减少循环迭代次数(一)缓存数组长度(二)提前终止循环三、优化循环内部操作(一)避免在循环内执行复杂计算(二)减少DOM操作四、选择合适的循环类型(一)for循环与while循环的选择(二)for...in与for...of的使用场景在JavaScript编程中,循环结构是实现重复执行任务的基础工具。然而,不当的循环使用常常会导致性能瓶颈,特别是在处理大量数据时,循环的</div> </li> <li><a href="/article/1903804271321739264.htm" title="性能优化中如何“避免链接关键请求”" target="_blank">性能优化中如何“避免链接关键请求”</a> <span class="text-muted">混血哲谈</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>在性能优化中,“避免链接关键请求”是指通过优化资源加载顺序和依赖关系,减少关键渲染路径中的链式请求(CriticalRequestChains),从而加速页面加载。以下是具体策略及实施步骤:一、什么是“关键请求链”?定义:关键请求链是浏览器在渲染首屏内容时必须按顺序加载的资源序列。例如:HTMLCSSFont浏览器需先下载HTML,解析后请求CSS,CSS解析后发现需要字体文件,再请求字体。问题:</div> </li> <li><a href="/article/1903788508699488256.htm" title="可视化埋点在React Native中的实践" target="_blank">可视化埋点在React Native中的实践</a> <span class="text-muted">Shopee技术团队</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</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%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>本文首发于微信公众号“Shopee技术团队”。1.背景笔者所在团队为Shopee的本地生活前端团队,用户可以在我们的平台购买优惠券,然后去线下门店使用。随着用户规模不断增加,研究用户行为数据可以更好地指导产品功能设计,提供更加优秀的用户体验。用户行为数据的研究首先涉及到如何采集,即我们常说的“埋点”。一直以来,我们项目中的埋点都采用代码埋点,每次新增埋点往往是一些重复性的工作,且需要重新发布代码才</div> </li> <li><a href="/article/1903788381238784000.htm" title="去哪儿网 ReactNative 跨小程序多端方案介绍" target="_blank">去哪儿网 ReactNative 跨小程序多端方案介绍</a> <span class="text-muted">去哪儿网技术沙龙</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%8D%E7%AB%AF/1.htm">大前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</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%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>1前言qrn-remax-unir是由去哪儿网前端技术团队实现的一套将RN适配到小程序端的跨端组件,通过该组件库可快速方便的将RN源代码直接运行到小程序端。方案参考了react-native-web的适配方案,使用remax框架来实现适配组件库并达到适配多小程序的目的。和react-native-web一样,它对RN源代码侵入度低,并且调试和替换组件相当方便。方案来自于社区,我们只是合理的应用用来</div> </li> <li><a href="/article/1903783717093044224.htm" title="Android端ReactNative环境搭建——上" target="_blank">Android端ReactNative环境搭建——上</a> <span class="text-muted">hzulwy</span> <a class="tag" taget="_blank" href="/search/reactnative/1.htm">reactnative</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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>前言最近一年,因为公司业务需要,部门引入了rn这门跨段技术来开发业务需求。从去年部门大佬调研rn这个框架到现在已有超过一年的时间了。而我从当时毕业不到1年的小白成长到现在负责维护项目的Android端代码的主力。同时,自己对rn相关的技术有了不少理解。因此,想要分享一些知识点,希望可以帮助到大家。我会以一个专栏的方式述说在这一年当中使用rn开发需求遇到的困难。大家可以借鉴参考下,共同进步!!!使用</div> </li> <li><a href="/article/1903780435507343360.htm" title="React Native 迁移的阵痛" target="_blank">React Native 迁移的阵痛</a> <span class="text-muted">Ethan. L</span> <a class="tag" taget="_blank" href="/search/ReactNative/1.htm">ReactNative</a><a class="tag" taget="_blank" href="/search/%26amp%3B/1.htm">&</a><a class="tag" taget="_blank" href="/search/JS/1.htm">JS</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/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>背景由于我们的移动应用程序已经存在多年,经历了许多开发者的更替,因此变得越来越臃肿和难以维护。此外,我们团队中的Android开发人员一直很短缺,这导致我们在两个平台上的开发进度和质量存在巨大差异。因此,我们决定采用ReactNative技术,将原生工程迁移到该平台上,以提高应用程序的可维护性和整体性能。我在《ReactNative技术选型分析》中,阐述了对现有原生工程集成ReactNative的</div> </li> <li><a href="/article/1903780309283958784.htm" title="Android React Native应用逆向分析初探" target="_blank">Android React Native应用逆向分析初探</a> <span class="text-muted">byc6352</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>随着移动互联网时代的到来,用户在移动设备上花费的时间越来越多,不仅是因为移动设备方便携带,而且还因为层出不穷的大量应用提供为用户使用,以往在电脑上才能做的事情,现在仅靠一部手机就可以解决了。当前的移动设备厂商很多,但是被广泛使用的主流系统却只有两个,Android和iOS,因此现在大多数应用都会有两个版本,Android版本和iOS版本。然而这两种应用的开发方式却完全不同,移动客户端开发人员不得不</div> </li> <li><a href="/article/1903755965526765568.htm" title="炫酷的HTML5粒子动画特效实现详解" target="_blank">炫酷的HTML5粒子动画特效实现详解</a> <span class="text-muted">木木黄木木</span> <a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>炫酷的HTML5粒子动画特效实现详解这里写目录标题炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1.HTML结构2.样式设计核心实现1.粒子类设计2.动画效果实现星空效果烟花效果雨滴效果3.鼠标交互性能优化效果展示总结项目介绍本文将详细介绍如何使用HTML5Canvas技术实现一个炫酷的粒子动画特效系统。该系统包含三种不同的动画效果:星空、烟花和雨滴,并支持鼠标交互功能,能够为网页增添</div> </li> <li><a href="/article/1903742716248911872.htm" title="Vue 中的日期格式化实践:从原生 Date 到可视化展示!!!" target="_blank">Vue 中的日期格式化实践:从原生 Date 到可视化展示!!!</a> <span class="text-muted">小丁学Java</span> <a class="tag" taget="_blank" href="/search/%E4%BA%A7%E5%93%81%E8%B5%84%E8%B4%A8%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/1.htm">产品资质管理系统</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ts/1.htm">ts</a> <div>Vue中的日期格式化实践:从原生Date到可视化展示在数据可视化场景中,日期时间的格式化显示是一个高频需求。本文将以一个邀请码关系树组件为例,深入解析Vue中日期格式化的核心方法、性能优化和最佳实践,并配合Mermaid流程图直观展示处理流程!一、️核心方法:原生Date对象处理代码实现privateformatDate(dateString:string|null):string{if(!dat</div> </li> <li><a href="/article/1903725060045205504.htm" title="LLM之向量数据库Chroma milvus FAISS" target="_blank">LLM之向量数据库Chroma milvus FAISS</a> <span class="text-muted">maxmaxma</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/milvus/1.htm">milvus</a><a class="tag" taget="_blank" href="/search/faiss/1.htm">faiss</a> <div>以下是Chroma、Milvus和FAISS的核心区别,从功能定位、架构设计、性能及应用场景等维度进行对比:一、功能定位Chroma轻量级向量数据库:专注于快速构建中小型语义搜索原型,提供简单易用的API,适合快速集成到现有应用中。特点:支持近似最近邻搜索(ANN)、实时性能优化,但对大规模数据处理能力有限。Milvus分布式向量数据库:专为超大规模向量数据设计,支持云原生架构和高可用性,适合企业</div> </li> <li><a href="/article/36.htm" title="ASM系列四 利用Method 组件动态注入方法逻辑" target="_blank">ASM系列四 利用Method 组件动态注入方法逻辑</a> <span class="text-muted">lijingyao8206</span> <a class="tag" taget="_blank" href="/search/%E5%AD%97%E8%8A%82%E7%A0%81%E6%8A%80%E6%9C%AF/1.htm">字节码技术</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/1.htm">动态代理</a><a class="tag" taget="_blank" href="/search/ASM/1.htm">ASM</a> <div>        这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以</div> </li> <li><a href="/article/163.htm" title="java编程思想 --内部类" target="_blank">java编程思想 --内部类</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E9%83%A8%E7%B1%BB/1.htm">内部类</a><a class="tag" taget="_blank" href="/search/%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB/1.htm">匿名内部类</a> <div>内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅   1,内部类的创建  内部类是创建在类中的 package com.wj.InsideClass; /* * 内部类的创建 */ public class CreateInsideClass { public CreateInsideClass(</div> </li> <li><a href="/article/290.htm" title="web.xml报错" target="_blank">web.xml报错</a> <span class="text-muted">crabdave</span> <a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a> <div>web.xml报错   The content of element type "web-app" must match "(icon?,display-  name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s</div> </li> <li><a href="/article/417.htm" title="泛型类的自定义" target="_blank">泛型类的自定义</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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%B3%9B%E5%9E%8B/1.htm">泛型</a> <div>   为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。 采用泛型类,完成扩展。   例如有一个学生类     Student{ Student(){ System.out.println("I'm a student....."); } }  有一个老师类   </div> </li> <li><a href="/article/544.htm" title="CSS清除浮动的4中方法" target="_blank">CSS清除浮动的4中方法</a> <span class="text-muted">IT独行者</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。 1、结尾处加空div标签 clear:both 1 2 3 4 .div 1 { background : #000080 ; border : 1px   s</div> </li> <li><a href="/article/671.htm" title="Cygwin使用windows的jdk 配置方法" target="_blank">Cygwin使用windows的jdk 配置方法</a> <span class="text-muted">_wy_</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/cygwin/1.htm">cygwin</a> <div>1.[vim /etc/profile]    JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43"  (windows下jdk路径为D:\Java\jdk1.6.0_43)    PATH="$JAVA_HOME/bin:${PATH}"    CLAS</div> </li> <li><a href="/article/798.htm" title="linux下安装maven" target="_blank">linux下安装maven</a> <span class="text-muted">无量</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a> <div>Linux下安装maven(转) 1.首先到Maven官网 下载安装文件,目前最新版本为3.0.3,下载文件为 apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令; 2.进入下载文件夹,找到下载的文件,运行如下命令解压 tar -xvf  apache-maven-2.2.1-bin.tar.gz 解压后的文件夹</div> </li> <li><a href="/article/925.htm" title="tomcat的https 配置,syslog-ng配置" target="_blank">tomcat的https 配置,syslog-ng配置</a> <span class="text-muted">aichenglong</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/http%E8%B7%B3%E8%BD%AC%E5%88%B0https/1.htm">http跳转到https</a><a class="tag" taget="_blank" href="/search/syslong-ng%E9%85%8D%E7%BD%AE/1.htm">syslong-ng配置</a><a class="tag" taget="_blank" href="/search/syslog%E9%85%8D%E7%BD%AE/1.htm">syslog配置</a> <div>1) tomcat配置https,以及http自动跳转到https的配置     1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)      keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit</div> </li> <li><a href="/article/1052.htm" title="关于领号活动总结" target="_blank">关于领号活动总结</a> <span class="text-muted">alafqq</span> <a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a> <div>关于某彩票活动的总结 具体需求,每个用户进活动页面,领取一个号码,1000中的一个; 活动要求 1,随机性,一定要有随机性; 2,最少中奖概率,如果注数为3200注,则最多中4注 3,效率问题,(不能每个人来都产生一个随机数,这样效率不高); 4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库) 解决方案 1,事先产生随机数1000个,并打</div> </li> <li><a href="/article/1179.htm" title="java数据结构 冒泡排序的遍历与排序" target="_blank">java数据结构 冒泡排序的遍历与排序</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>java的冒泡排序是一种简单的排序规则   冒泡排序的原理:           比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;         针对所有的元素重复以上的步骤,除了最后一个     例题;将int array[] </div> </li> <li><a href="/article/1306.htm" title="JS检查输入框输入的是否是数字的一种校验方法" target="_blank">JS检查输入框输入的是否是数字的一种校验方法</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>如下是JS检查输入框输入的是否是数字的一种校验方法: <form method=post target="_blank"> 数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br> </form> </div> </li> <li><a href="/article/1433.htm" title="Test注解的两个属性:expected和timeout" target="_blank">Test注解的两个属性:expected和timeout</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a><a class="tag" taget="_blank" href="/search/expected/1.htm">expected</a><a class="tag" taget="_blank" href="/search/timeout/1.htm">timeout</a> <div>JUnit4:Test文档中的解释:   The Test annotation supports two optional parameters.   The first, expected, declares that a test method should throw an exception.   If it doesn't throw an exception or if it </div> </li> <li><a href="/article/1560.htm" title="[Gson二]继承关系的POJO的反序列化" target="_blank">[Gson二]继承关系的POJO的反序列化</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a> <div>父类     package inheritance.test2; import java.util.Map; public class Model { private String field1; private String field2; private Map<String, String> infoMap</div> </li> <li><a href="/article/1687.htm" title="【Spark八十四】Spark零碎知识点记录" target="_blank">【Spark八十四】Spark零碎知识点记录</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a> <div>1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的 ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中   </div> </li> <li><a href="/article/1814.htm" title="WAS各种脚本作用大全" target="_blank">WAS各种脚本作用大全</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/WAS+%E8%84%9A%E6%9C%AC/1.htm">WAS 脚本</a> <div>   http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html    无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下     获取下载 这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自</div> </li> <li><a href="/article/1941.htm" title="java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句" target="_blank">java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/switch/1.htm">switch</a> <div>借鉴网上的思路,用java实现: public class NoIfWhile { /** * @param args * * find x=1+2+3+....n */ public static void main(String[] args) { int n=10; int re=find(n); System.o</div> </li> <li><a href="/article/2068.htm" title="Netty源码学习-ObjectEncoder和ObjectDecoder" target="_blank">Netty源码学习-ObjectEncoder和ObjectDecoder</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/netty/1.htm">netty</a> <div>Netty中传递对象的思路很直观: Netty中数据的传递是基于ChannelBuffer(也就是byte[]); 那把对象序列化为字节流,就可以在Netty中传递对象了 相应的从ChannelBuffer恢复对象,就是反序列化的过程 Netty已经封装好ObjectEncoder和ObjectDecoder 先看ObjectEncoder ObjectEncoder是往外发送</div> </li> <li><a href="/article/2195.htm" title="spring 定时任务中cronExpression表达式含义" target="_blank">spring 定时任务中cronExpression表达式含义</a> <span class="text-muted">chicony</span> <a class="tag" taget="_blank" href="/search/cronExpression/1.htm">cronExpression</a> <div>一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示: 代表含义            是否必须 允许的取值范围         &nb</div> </li> <li><a href="/article/2322.htm" title="Nutz配置Jndi" target="_blank">Nutz配置Jndi</a> <span class="text-muted">ctrain</span> <a class="tag" taget="_blank" href="/search/JNDI/1.htm">JNDI</a> <div>1、使用JNDI获取指定资源: var ioc = { dao : { type :"org.nutz.dao.impl.NutDao", args : [ {jndi :"jdbc/dataSource"} ] } } 以上方法,仅需要在容器中配置好数据源,注入到NutDao即可. </div> </li> <li><a href="/article/2449.htm" title="解决 /bin/sh^M: bad interpreter: No such file or directory" target="_blank">解决 /bin/sh^M: bad interpreter: No such file or directory</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a> <div>在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。   分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。 解决: 1)在windows下转换: 利用一些编辑器如UltraEdit或EditPlus等工具</div> </li> <li><a href="/article/2576.htm" title="[转]for 循环为何可恨?" target="_blank">[转]for 循环为何可恨?</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6/1.htm">读书</a> <div>  Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。 不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju</div> </li> <li><a href="/article/2703.htm" title="Android实用小技巧" target="_blank">Android实用小技巧</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>1、去掉所有Activity界面的标题栏   修改AndroidManifest.xml   在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"   2、去掉所有Activity界面的TitleBar 和StatusBar    修改AndroidManifes</div> </li> <li><a href="/article/2830.htm" title="Oracle 复习笔记之序列" target="_blank">Oracle 复习笔记之序列</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/Oracle+%E5%BA%8F%E5%88%97/1.htm">Oracle 序列</a><a class="tag" taget="_blank" href="/search/sequence/1.htm">sequence</a><a class="tag" taget="_blank" href="/search/Oracle+sequence/1.htm">Oracle sequence</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2098859 1.序列的作用 序列是用于生成唯一、连续序号的对象 一般用序列来充当数据库表的主键值 2.创建序列语法如下:   create sequence s_emp start with 1 --开始值 increment by 1 --増长值 maxval</div> </li> <li><a href="/article/2957.htm" title="有“品”的程序员" target="_blank">有“品”的程序员</a> <span class="text-muted">gongmeitao</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>完美程序员的10种品质     完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的   完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:   1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强   (范围:用简单方式解决复杂问题)   </div> </li> <li><a href="/article/3084.htm" title="使用KeleyiSQLHelper类进行分页查询" target="_blank">使用KeleyiSQLHelper类进行分页查询</a> <span class="text-muted">hvt</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a> <div>本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D</div> </li> <li><a href="/article/3211.htm" title="SVG 教程 (三)圆形,椭圆,直线" target="_blank">SVG 教程 (三)圆形,椭圆,直线</a> <span class="text-muted">天梯梦</span> <a class="tag" taget="_blank" href="/search/svg/1.htm">svg</a> <div>SVG <circle> SVG 圆形 - <circle> <circle> 标签可用来创建一个圆: 下面是SVG代码: <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <circle cx="100" c</div> </li> <li><a href="/article/3338.htm" title="链表栈" target="_blank">链表栈</a> <span class="text-muted">luyulong</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> <div> public class Node { private Object object; private Node next; public Node() { this.next = null; this.object = null; } public Object getObject() { return object; } public</div> </li> <li><a href="/article/3465.htm" title="基础数据结构和算法十:2-3 search tree" target="_blank">基础数据结构和算法十:2-3 search tree</a> <span class="text-muted">sunwinner</span> <a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/2-3+search+tree/1.htm">2-3 search tree</a> <div>  Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga</div> </li> <li><a href="/article/3592.htm" title="spring配置定时任务" target="_blank">spring配置定时任务</a> <span class="text-muted">stunizhengjia</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a> <div>最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:     //------------------------定时任务调用的方法------------------------------ /** * 存储过程定时器 */ publi</div> </li> <li><a href="/article/3719.htm" title="ITeye 8月技术图书有奖试读获奖名单公布" target="_blank">ITeye 8月技术图书有奖试读获奖名单公布</a> <span class="text-muted">ITeye管理员</span> <a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a> <div>ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。 8月试读活动回顾: http://webmaster.iteye.com/blog/2102830 本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀): 《跨终端Web》 gleams:http</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>