基于 vue3 + webpack 5 + sass+ vw 适配方案+axios 封装,从0构建手机端模板脚手架

Webpack5正式发布也有很长长长一段时间了,上手了一段时候后发现真香。webpack5的新特性使得我们在配置上比以往版本更加方便了,构建速度也有了质的飞跃。本文着重为大家讲解从 0 到 1 搭建 vue3 + webpack 5开发环境的过程中遇到的疑问。

项目地址: webpack5-vue3

demo地址: https://zhouyupeng.github.io/webpack5-vue3/#/

先看一下配置好的项目目录结构

├─build
│  ├─webpack.base.conf.js 
│  ├─webpack.dev.conf.js   
│  ├─webpack.prod.conf.js 
│  ├─webpack.rules.conf.js 
├─node_modules
├─public
|  |-index.html
└─src
|  ├─api
|  ├─assets
|  ├─components
|  ├─filters
|  ├─plugins
|  ├─router
|  ├─store
|  ├─style
|  ├─utils
|  ├─views
|  |-App.vue
|  |-main.ts
|-.env.dev
|-.env.test
|-.env.prod
|-.gitigore
|-babel.config.js
|-package.json
|-postcss.config.js

接下来,我们使用 Webpack5 从0搭建一个完整的 Vue3 的开发环境!

环境(environment)

webpack 5 运行于 Node.js v10.13.0+ 的版本。

本文涉及到依赖的版本号

├── webpack           5.43
├── webpack-cli       4.7.2
├── node              14.17.0

初始化目录

第一步: 创建目录并且初始化 package.json

mkdir webpack5-vue3 && cd webpack5-vue3
yarn init -y

第二步: 安装webpack三件套

yarn add webpack webpack-cli webpack-dev-server -D

注意:

  1. -D 等价于 --save-dev; 开发环境时所需依赖
  2. -S 等价于 --save; 生产环境时所需依赖

第三步:初始化目录和文件

  • 创建./build/webpack.config.js文件和./src/main.js文件并且写上webpack打包配置代码

    // webpack.config.js
    const path = require('path');
    module.exports = {
      entry: path.resolve(__dirname, '../src/main.js'), // 入口
      output: {
          path: path.resolve(__dirname, '../dist'),
          filename: './js/[name].[chunkhash].js',
          publicPath: './',
      },
    }
  • 在package.json的scripts里写上打包命令

    "build": "webpack --config ./build/webpack.config.js --mode production --progress --color -w"

    参数详解

  • --config或-c: 提供 webpack 配置文件的路径,例如 ./webpack.config.js
  • --mode:配置环境也可写在配置文件里 不配置mode 默认production模式打包
  • --progress: 启用在构建过程中打印编译进度
  • --color: 启用控制台颜色
  • --watch或-w: 监听文件变化

运行打包脚本yarn build看到webpack运行并且打包成功了。

配置开发服务器

webpack5 + webpack-cli4 启动开发服务器命令与之前有所变化,从 webpack-dev-server 转变为 webpack serve,

"build": "webpack serve --config ./build/webpack.config.js --mode development --progress --color",

运行起来后出现了另外的问题。改了代码控制台重新编译,但是热更新无效。

看一下无效的启动和有效启动之后的 network 截图对比:
基于 vue3 + webpack 5 + sass+ vw 适配方案+axios 封装,从0构建手机端模板脚手架_第1张图片
基于 vue3 + webpack 5 + sass+ vw 适配方案+axios 封装,从0构建手机端模板脚手架_第2张图片

网上找了一圈,说删除 package.json 里的 browserslist可以热更,截止我写这篇文章安装的依赖版本时不行,
最后在issues看到解决办法,按照官方给出的解释好像只会在[email protected]中修复这个问题,这里安装beta最新版本yarn add webpack-dev-server@lastest -D,运行代码发现热更新成功。
安装webpack-dev-server 4.X版本后配置发生了很多改变,废弃了很多以前的配置
4.x配置点我点我或者看这里

分环境打包

在我们平时项目开发中,一般都会有:开发环境、测试环境、预发布环境和生产环境。现在来对 webpack 的配置文件进行环境拆分。

拆分文件
├─build
│  ├─webpack.base.conf.js   //公共配置
│  ├─webpack.dev.conf.js    //mode为development配置
│  ├─webpack.prod.conf.js   //mode为production配置
│  ├─webpack.rules.conf.js  //loader配置
配置环境变量

使用dotenv来按需加载不同的环境变量,VUE CLI3的环境变量也是使用的这个插件

  • 安装dotenv插件

    yarn add dotenv -D
  • 修改webpack.base.conf.js

    //...
    const envMode = process.env.envMode
    require('dotenv').config({ path: `.env.${envMode}` })
    // 正则匹配以 VUE_APP_ 开头的 变量
    const prefixRE = /^VUE_APP_/
    let env = {}
    // 只有 NODE_ENV,BASE_URL 和以 VUE_APP_ 开头的变量将通过 webpack.DefinePlugin 静态地嵌入到客户端侧的代码中
    for (const key in process.env) {
      if (key == 'NODE_ENV' || key == 'BASE_URL' || prefixRE.test(key)) {
          env[key] = JSON.stringify(process.env[key])
      }
    }
    
    plugins: [
      //...
      new webpack.DefinePlugin({ // 定义环境变量
          'process.env': {
              ...env
          }
      })
    ]
    
  • 修改package.json

    "scripts": {
    "dev": "cross-env envMode=dev webpack serve --config ./build/webpack.dev.conf.js  --color",
    "build": "cross-env envMode=prod webpack --config build/webpack.prod.conf.js  --color",
    "build:test": "cross-env envMode=test webpack --config build/webpack.prod.conf.js  --color"
    },
  • 配置变量文件
.env.dev
.env.test
.env.prod

配置完成后可以像VUE CLI3一样使用环境变量了点我点我

配置核心功能

将 ES6+ 转 ES5

由于有些浏览器无法解析 ES6+ 等高级语法,故需要将其转化为浏览器能够解析的低版本语法

yarn add @babel/core @babel/preset-env babel-loader -D
yarn add core-js -S

loader配置

// webpack.rules.conf.js
rules: [
    {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
            loader: 'babel-loader',
        }
    }, 
]

Babel 配置文件
Babel的配置文件是Babel执行时默认会在当前目录寻找的文件,主要有.babelrc,.babelrc.js,babel.config.js和package.json。它们的配置项都是相同,作用也是一样的,只需要选择其中一种。
推荐使用后缀名是js配置文件,因为可以使用js做一些逻辑处理,适用性更强。

// babel.config.js
const presets = [
    ["@babel/preset-env", {
        "useBuiltIns": 'usage', // 这里配置usage 会自动根据你使用的方法以及你配置的浏览器支持版本引入对于的方法。
        "corejs": "3.11.0" // 指定 corejs 版本 
    }]
]
const plugins = [
]
module.exports = {
    plugins,
    presets

}
产出HTML

安装 html-webpack-plugin 插件处理 index.html 文件,此插件的功能是根据提供的模板文件,自动生成正确的项目入口文件,并把 webpack 打包的 js 文件自动插入其中

yarn add html-webpack-plugin -D

plugins配置

webpack.base.conf.js
new HtmlWebpackPlugin({
    template: path.resolve(__dirname, '../public/index.html'),
    filename: 'index.html',
    title: 'webpack5+vue3',
    minify: {
        html5: true, // 根据HTML5规范解析输入
        collapseWhitespace: true, // 折叠空白区域
        preserveLineBreaks: false,
        minifyCSS: true, // 压缩文内css
        minifyJS: true, // 压缩文内js
        removeComments: false // 移除注释
    },
    files: prodMode ? cdn.prod : cdn.dev //CDN引入文件配置
}),

这里的index.html源文件放在../public/文件夹里。
注意: 配置动态网页标题时,需将模板中的 </code> 标签里的内容改成 <code><%= htmlWebpackPlugin.options.title %></code><br><strong>CDN引入js</strong></p> <pre><code><% for (var i in htmlWebpackPlugin.options.files&&htmlWebpackPlugin.options.files.js) { %> <script src="<%= htmlWebpackPlugin.options.files.js[i] %>"></script> <% } %></code></pre> <h5>添加 css 和 sass 支持</h5> <pre><code>yarn add style-loader css-loader -D yarn add node-sass sass-loader -D yarn add autoprefixer postcss-loader -D </code></pre> <p><strong>loader配置</strong></p> <pre><code>//webpack.rules.conf.js { test: /\.(css|scss|sass)$/, use: [ 'style-loader', 'css-loader', 'postcss-loader', 'sass-loader' ] }</code></pre> <p><a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.docschina.org%2Fconcepts%2Floaders%2F%23configuration" rel="nofollow">loader</a> 从右到左(或从下到上)地取值(evaluate)/执行(execute)。在上面的示例中,从 sass-loader 开始执行,最后以 style-loader 为结束。</p> <h5>配置 alias 别名</h5> <p>创建 import 或 require 的别名,来确保模块引入变得更简单</p> <pre><code>// webpack.base.conf.js resolve: { alias: { "@": path.resolve(__dirname, "../src"), assets: path.resolve(__dirname, '../src/assets/'), img: path.resolve(__dirname, '../src/assets/img'), utils: path.resolve(__dirname, '../src/utils'), api: path.resolve(__dirname, '../src/api'), }, },</code></pre> <h5>处理图片等静态资源</h5> <p>Webpack5 之前我们处理静态资源比如PNG 图片、SVG 图标等等,需要用到url-loader,file-loader,raw-loader。Webpack5 提供了内置的静态资源构建能力,我们不需要安装额外的 loader,仅需要简单的配置就能实现静态资源的打包和分目录存放。这三个loader在github上也停止了更新。</p> <p>webpack5使用四种新增的资源模块(<a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.js.org%2Fguides%2Fasset-modules%2F" rel="nofollow">Asset Modules</a>)替代了这些loader的功能。</p> <p>asset/resource 将资源分割为单独的文件,并导出url,就是之前的 file-loader的功能.<br>asset/inline 将资源导出为dataURL(url(data:))的形式,之前的 url-loader的功能.<br>asset/source 将资源导出为源码(source code). 之前的 raw-loader 功能.<br>asset 自动选择导出为单独文件或者 dataURL形式(默认为8KB). 之前有url-loader设置asset size limit 限制实现。</p> <pre><code>//webpack.rules.conf.js { test: /\.(png|jpg|svg|gif)$/, type: 'asset/resource', generator: { // [ext]前面自带"." filename: 'assets/[hash:8].[name][ext]', }, } </code></pre> <p><strong><a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.js.org%2Fguides%2Fasset-modules%2F" rel="nofollow">更多配置点我点我</a></strong></p> <h5>打包时清除上次构建dist目录</h5> <p>webpack5.20以下版本清除dist文件内容一般使用插件 clean-webpack-plugin, 5.20版本以后output新增特性<a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.js.org%2Fconfiguration%2Foutput%2F%23outputclean" rel="nofollow">clean</a>,用于清除dist文件</p> <pre><code>//webpack.prod.conf.js module.exports = { //... output: { clean: true, // Clean the output directory before emit. }, };</code></pre> <p><a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.js.org%2Fconfiguration%2Foutput%2F%23outputclean" rel="nofollow">更多配置点我点我</a></p> <h5>静态资源输出到根目录</h5> <pre><code>yarn add copy-webpack-plugin -D</code></pre> <p>当某些文件不需要经过webpack打包处理而直接使用,这里我们可以使用 <code>copy-webpack-plugin</code> 这个插件,在构建的时候,将 public/ 的静态资源直接复制到 dist根目录下</p> <pre><code>//webpack.prod.conf.js new copyWebpackPlugin({ patterns: [{ from: path.resolve(__dirname, "../public"), to: './', globOptions: { dot: true, gitignore: true, ignore: ["**/index.html*"], } }] }),</code></pre> <h5>提取样式文件</h5> <p>本插件会将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。</p> <pre><code>yarn add mini-css-extract-plugin -D</code></pre> <pre><code>//webpack.prod.conf.js plugins: [ //... new miniCssExtractPlugin({ filename: './css/[name].[contenthash].css', chunkFilename: './css/[id].[contenthash].css', }) ],</code></pre> <p>修改<code>webpack.rules.conf.js</code></p> <pre><code>{ test: /\.(css|scss|sass)$/, use: [ !prodMode ? 'style-loader' : { loader: MiniCssExtractPlugin.loader, options: { publicPath: '../', }, }, 'css-loader', 'postcss-loader', 'sass-loader', ], },</code></pre> <h4>识别 .vue文件</h4> <pre><code>yarn add vue-loader@next @vue/compiler-sfc -D yarn add vue@next -S</code></pre> <p><strong>注意:</strong></p> <ul> <li>vue-loader:它是基于 webpack 的一个的 loader 插件,解析和转换 .vue 文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,vue 3.x需要安装vue-loader@next。</li> <li>@vue/compiler-sfc: Vue 2.x 时代,需要 vue-template-compiler 插件处理 .vue 内容为 ast , Vue 3.x 则变成 @vue/compiler-sfc 。</li> </ul> <p><strong>修改webpack配置</strong></p> <pre><code>// webpack.rules.conf.js rules: [ { test: /\.vue$/, use: [ 'vue-loader' ] } ] //webpack.base.conf.js const { VueLoaderPlugin } = require('vue-loader/dist/index'); plugins: [ new VueLoaderPlugin() ] </code></pre> <p><strong>添加App.vue</strong></p> <pre><code><template> <div> <p class="title">{{title}}</p> </div> </template> <script> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const title = ref('渐进式JavaScript 框架'); return { title } } }) </script> <style scoped> .title{ color: #000; } </style></code></pre> <p><strong>修改main.js</strong></p> <pre><code class="js">import { createApp } from 'vue' // Vue 3.x 引入 vue 的形式 import App from './App.vue' // 引入 APP 页面组建 const app = createApp(App) // 通过 createApp 初始化 app app.mount('#root') // 将页面挂载到 root 节点</code></pre> <p>跑一遍代码,运行成功。</p> <h4>安装Vue全家桶</h4> <pre><code> yarn add vue-router@4 vuex@next axios -S</code></pre> <h4>vw适配</h4> <pre><code>yarn add postcss-loader postcss-px-to-viewport -D</code></pre> <p>新建postcss.config.js文件</p> <pre><code>'postcss-px-to-viewport': { unitToConvert: 'px', // 需要转换的单位,默认为"px" viewportWidth: 750, // 设计稿的视口宽度 unitPrecision: 5, // 单位转换后保留的精度 propList: ['*'], // 能转化为vw的属性列表 viewportUnit: 'vw', // 希望使用的视口单位 fontViewportUnit: 'vw', // 字体使用的视口单位 selectorBlackList: ['.ignore', '.hairlines', '.ig-'], // 需要忽略的CSS选择器 minPixelValue: 1, // 最小的转换数值,如果为1的话,只有大于1的值会被转换 mediaQuery: false, // 媒体查询里的单位是否需要转换单位 replace: true, // 是否直接更换属性值,而不添加备用属性 include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换,例如只转换 'src/mobile' 下的文件 (include: /\/src\/mobile\//) landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape) landscapeUnit: 'vw', // 横屏时使用的单位 landscapeWidth: 568 // 横屏时使用的视口宽度 }</code></pre> <h4>去掉生产环境console.log</h4> <p>使用TerserWebpackPlugin来进行去除<code>console.log</code>,压缩JS,webpack5之后自带最新的<code>terser-webpack-plugin</code>,无需再重新安装<a href="https://link.segmentfault.com/?url=https%3A%2F%2Fgithub.com%2Fwebpack-contrib%2Fterser-webpack-plugin" rel="nofollow">原文点我点我</a></p> <pre><code>//webpack.prod.conf.js minimizer: [ new TerserPlugin({ // 多进程 parallel: true, //删除注释 extractComments: false, terserOptions: { compress: { // 生产环境去除console drop_console: true, drop_debugger: true, }, }, }) ],</code></pre> <h4>编译缓存</h4> <p>Webpack5 内置 <code>FileSystem Cache</code> 能力加速二次构建,可以通过以下配置来实现</p> <pre><code>cache: { type: 'filesystem', // 可选配置 buildDependencies: { config: [__filename], // 当构建依赖的config文件(通过 require 依赖)内容发生变化时,缓存失效 }, name: '', // 配置以name为隔离,创建不同的缓存文件,如生成PC或mobile不同的配置缓存 ..., },</code></pre> <p>配置好后第二次构建速度快的飞起。<br>注意事项:</p> <ul> <li>cache 的属性 type 会在开发模式下被默认设置成 <code>memory</code>,而且在生产模式中被禁用,所以如果想要在生产打包时使用缓存需要显式的设置。</li> <li>为了防止缓存过于固定,导致更改构建配置无感知,依然使用旧的缓存,默认情况下,每次修改构建配置文件都会导致重新开始缓存。当然也可以自己主动设置 <code>version</code> 来控制缓存的更新。</li> </ul> <h4>集成 Vant</h4> <pre><code>yarn add vant@next -S</code></pre> <ul> <li><p>按需引入</p><pre><code>yarn add babel-plugin-import -D</code></pre></li> <li><p>修改配置</p><pre><code>// babel.config.js const plugins = [ ['import', { libraryName: 'vant', libraryDirectory: 'es', style: true }, 'vant'] ]</code></pre></li> <li>vant 适配vw</li> </ul> <p>修改postcss.config.js</p> <pre><code>const path = require('path'); module.exports = ({file}) => { const designWidth = file.includes(path.join('node_modules', 'vant')) ? 375 : 750; return { plugins: { 'postcss-px-to-viewport': { unitToConvert: 'px', // 需要转换的单位,默认为"px" viewportWidth: designWidth, // 设计稿的视口宽度 unitPrecision: 5, // 单位转换后保留的精度 propList: ['*'], // 能转化为vw的属性列表 viewportUnit: 'vw', // 希望使用的视口单位 fontViewportUnit: 'vw', // 字体使用的视口单位 selectorBlackList: ['.ignore', '.hairlines', '.ig-'], // 需要忽略的CSS选择器 minPixelValue: 1, // 最小的转换数值,如果为1的话,只有大于1的值会被转换 mediaQuery: false, // 媒体查询里的单位是否需要转换单位 replace: true, // 是否直接更换属性值,而不添加备用属性 include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换,例如只转换 'src/mobile' 下的文件 (include: /\/src\/mobile\//) landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape) landscapeUnit: 'vw', // 横屏时使用的单位 landscapeWidth: 568 // 横屏时使用的视口宽度 } } } }</code></pre> <h4>wepback的可视化资源分析插件</h4> <pre><code>yarn add webpack-bundle-analyzer -D</code></pre> <p>用来分析哪些模块引入了哪些代码,进行有目的性的优化代码<br>在打包脚本后面加<code>--analyze</code> 如<code>yarn build --analyze</code>,无需另外配置。新版本webpack-cli已经支持了。<a href="https://link.segmentfault.com/?url=https%3A%2F%2Fwebpack.js.org%2Fapi%2Fcli%2F%23analyzing-bundle" rel="nofollow">原文</a></p> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/e743a97be1ca465c80b0387d077c2deb.jpg" target="_blank"><img class="lazy" alt="基于 vue3 + webpack 5 + sass+ vw 适配方案+axios 封装,从0构建手机端模板脚手架_第3张图片" title="" src="http://img.e-com-net.com/image/info9/e743a97be1ca465c80b0387d077c2deb.jpg" width="650" height="314" style="border:1px solid black;"></a></span></p> <h4>最后</h4> <p>不知道大家看完这篇文章,学废了吗。文章中若是有错误或者不准确的地方,欢迎大家指出讨论。</p> <h4>欢迎关注</h4> <p>欢迎关注小程序“<code>进阶的大前端</code>”,800多道前端面试题在线查看<br><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/17d9fd0ad88d4c97a849f51b0409c332.jpg" target="_blank"><img class="lazy" alt="基于 vue3 + webpack 5 + sass+ vw 适配方案+axios 封装,从0构建手机端模板脚手架_第4张图片" title="" src="http://img.e-com-net.com/image/info9/17d9fd0ad88d4c97a849f51b0409c332.jpg" width="430" height="430" style="border:1px solid black;"></a></span></p> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1420415145653424128"></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">你可能感兴趣的:(vue.js前端webpack)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1891136538134245376.htm" title="Android AIDL实现进程间通讯IPC" target="_blank">Android AIDL实现进程间通讯IPC</a> <span class="text-muted">2501_90326753</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>以下是一个简单的实现:1.AIDLServer提供数据接口①创建.aidl文件,公开接口给Client:packagecom.example.aidlserver.aidl;interfaceDataService{intgetData(Stringtype);StringgetTime();}②对应的Service,实现aidl中对应的方法:packagecom.example.aidlserv</div> </li> <li><a href="/article/1891132126678544384.htm" title="MySQL修改max_allowed_packet" target="_blank">MySQL修改max_allowed_packet</a> <span class="text-muted">一张假钞</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>个人博客地址:MySQL修改max_allowed_packet|一张假钞的真实世界通过global参数设置:setglobalmax_allowed_packet=32*1024*1024;注意,下面的写法是不正确的:setglobalmax_allowed_packet=32m;如果要重启也生效的话,在my.cnf中添加如下配置:max_allowed_packet=32m</div> </li> <li><a href="/article/1891101604044664832.htm" title="Vue 2 路由指南:从基础到高级" target="_blank">Vue 2 路由指南:从基础到高级</a> <span class="text-muted">鸡吃丸子</span> <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/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>注意:对于代码看不清的部分,用鼠标选中就能看到了,背景颜色和字体颜色过于接近,我也不知道怎么调,只能这样子先看着了一、VueRouter是什么?VueRouter是Vue.js官方的路由管理器,它允许你在单页面应用中通过不同的URL显示不同的组件。VueRouter与Vue.js核心深度集成,提供了声明式的路由定义、嵌套路由、动态路由、导航守卫等功能,帮助开发者构建复杂的单页面应用。二、安装与配置</div> </li> <li><a href="/article/1891078912692252672.htm" title="Flux架构:构建可预测的Web应用状态管理体系" target="_blank">Flux架构:构建可预测的Web应用状态管理体系</a> <span class="text-muted">阿珊和她的猫</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前端开发工程师、技术日更博主、已过CET6阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1牛客高级专题作者、打造专栏《前端面试必备》、《2024面试高频手撕题》蓝桥云课签约作者、上架课程《Vue.js和Egg.js开发企业级健康管理项目》、《带你从入门到实战全面掌握uni-app》前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。文章</div> </li> <li><a href="/article/1891075634638155776.htm" title="找不到gpedit.msc 的解决方法" target="_blank">找不到gpedit.msc 的解决方法</a> <span class="text-muted">大写字母E</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E9%85%8D%E7%BD%AE/1.htm">计算机配置</a><a class="tag" taget="_blank" href="/search/window/1.htm">window</a> <div>通常打开本地组策略编辑器,只需要win+R在运行里输入gpedit.msc就可以打开。但是,在windows家庭版和学生版里,会提示找不到路径。可以用以下办法解决:新建一个文本文档,名字随便取,编辑以下批处理内容,保存后将后缀名改为.bat,右键使用管理员权限执行:@echooffpushd"%~dp0"dir/bC:\Windows\servicing\Packages\Microsoft-Wi</div> </li> <li><a href="/article/1891071094589288448.htm" title="【cmd】Win10家庭版找不到 gpedit.msc (组策略)的解决方法" target="_blank">【cmd】Win10家庭版找不到 gpedit.msc (组策略)的解决方法</a> <span class="text-muted">顾三殇</span> <a class="tag" taget="_blank" href="/search/Win/1.htm">Win</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%2Fcmd/1.htm">服务器部署/cmd</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E4%BB%A4/1.htm">命令</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E7%AD%96%E7%95%A5/1.htm">组策略</a> <div>目录一、创建cmd文件二、以“管理员身份”运行“gpedit.cmd”文件三、运行“gpedit.msc”命令查看组策略一、创建cmd文件(1)新建一个文件名为“gpedit.txt”的txt文本文档:(2)文本中写入以下内容:@echooffpushd"%~dp0"dir/bC:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-C</div> </li> <li><a href="/article/1891060507582984192.htm" title="找不到“本地策略”,没有“本地策略”的解决办法" target="_blank">找不到“本地策略”,没有“本地策略”的解决办法</a> <span class="text-muted">Bawei_</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>本文提供找不到本地策略的解决办法只需4步,结果如下图:1.首先打开记事本,并输入以下内容@echooffpushd“%~dp0”dir/b%systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum>gp.txtdir/b%systemroot%\servi</div> </li> <li><a href="/article/1891046762743918592.htm" title="go语言:实现hexagonal numbers六边形数算法(附完整源码)" target="_blank">go语言:实现hexagonal numbers六边形数算法(附完整源码)</a> <span class="text-muted">源代码大师</span> <a class="tag" taget="_blank" href="/search/go%E7%AE%97%E6%B3%95%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B/1.htm">go算法实战教程</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/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>go语言:实现hexagonalnumbers六边形数算法代码说明:如何运行代码:六边形数是指可以用六边形排列的点数,公式为H=n(2n−1),其中n是正整数。下面是用Go语言实现六边形数算法的完整源码:packagemainimport("fmt")//HexagonalNumber计算第n个六边形数funcHexagonalNumber(nint)int{</div> </li> <li><a href="/article/1891045375565950976.htm" title="优先级队列 PriorityQueue 模拟实现" target="_blank">优先级队列 PriorityQueue 模拟实现</a> <span class="text-muted">a添砖Java</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录概要整体架构流程小结概要优先级队列实际是小堆,根据不同的比较方法实现小堆,也可以根据自己的需要重写比较方法,从而实现自己想要的优先级队列,获取想要的数据,接下来将会用整数模拟实现一个优先级队列;这里我的优先是优先获取最小的元素,保证出队的永远是现存的数据里最小的;整体架构流程packagedom.bite;importjava.util.Arrays;publicclassPriority</div> </li> <li><a href="/article/1891044744973316096.htm" title="Vue.js 新手必看:5个趣味小案例快速理解数据绑定原理" target="_blank">Vue.js 新手必看:5个趣味小案例快速理解数据绑定原理</a> <span class="text-muted">云资社</span> <a class="tag" taget="_blank" href="/search/VUE/1.htm">VUE</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>Vue.js是一个渐进式JavaScript框架,用于构建用户界面。其核心特性之一是数据绑定,它允许开发者通过简单的声明式语法将数据与DOM元素绑定在一起。这种双向数据绑定机制使得数据更新和视图更新变得非常直观和高效。本文将通过5个趣味小案例,帮助Vue.js新手快速理解数据绑定的原理和实现方式。案例1:简单的文本绑定目标将输入框中的内容实时显示在页面上。实现代码Vue数据绑定-文本绑定输入框内容</div> </li> <li><a href="/article/1891032894009307136.htm" title="flask实现mysql连接池_如何在python flask中使用mysql.connection数据库池" target="_blank">flask实现mysql连接池_如何在python flask中使用mysql.connection数据库池</a> <span class="text-muted">weixin_39710396</span> <a class="tag" taget="_blank" href="/search/flask%E5%AE%9E%E7%8E%B0mysql%E8%BF%9E%E6%8E%A5%E6%B1%A0/1.htm">flask实现mysql连接池</a> <div>Traceback(mostrecentcalllast):File"/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py",line1836,in__call__returnself.wsgi_app(environ,start_response)File"/home/</div> </li> <li><a href="/article/1891022804594257920.htm" title="UDP反射放大攻击.c" target="_blank">UDP反射放大攻击.c</a> <span class="text-muted">金猪报喜-阿尔法</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>#include#include#include#include#include#include#include#include#include#include#defineMAX_PACKET_SIZE8192#definePHI0x9e3779b9#definePACKETS_PER_RESOLVER5staticuint32_tQ[4096],c=362436;structlist{stru</div> </li> <li><a href="/article/1891021921319972864.htm" title="深入理解现代前端框架:Vue.js 的进阶探秘" target="_blank">深入理解现代前端框架:Vue.js 的进阶探秘</a> <span class="text-muted">lozhyf</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a> <div>在当今的web开发领域,前端框架如雨后春笋般涌现,而Vue.js凭借其简洁易用和强大的功能,成为了众多开发者的心头好。本文将带领大家深入探索Vue.js的一些进阶特性,帮助你将Vue应用开发提升到新的高度。一、Vue.js的响应式原理Vue.js最核心的特性之一就是其响应式系统。当数据发生变化时,Vue能够自动更新DOM,这一过程是如何实现的呢?Vue.js使用了Object.defineProp</div> </li> <li><a href="/article/1891000740210601984.htm" title="【VUE】前端工程化与前端工程化与webpack" target="_blank">【VUE】前端工程化与前端工程化与webpack</a> <span class="text-muted">boy快快长大</span> <a class="tag" taget="_blank" href="/search/VUE/1.htm">VUE</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.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>前端工程化与webpack1.前端工程化2.webpack的基本使用2.1创建列表隔行变色项目1.前端工程化2.webpack的基本使用2.1创建列表隔行变色项目初始化项目①新建项目空白目录,并运行npminit–y命令,初始化包管理配置文件package.json②新建src源代码目录③新建src->index.html首页和src->index.js脚本文件④初始化首页基本的结构⑤运行npmi</div> </li> <li><a href="/article/1890967699882831872.htm" title="启动Springboot项目maven命令" target="_blank">启动Springboot项目maven命令</a> <span class="text-muted">It_BeeCoder</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a> <div>1mvncleancompile,将项目重新编译2mvninstall,打包3mvnspring-boot:run,启动项目4mvnpackage,打成war包</div> </li> <li><a href="/article/1890965177625538560.htm" title="Vue.js 配置 Babel、Webpack 和 ESLint" target="_blank">Vue.js 配置 Babel、Webpack 和 ESLint</a> <span class="text-muted">轻口味</span> <a class="tag" taget="_blank" href="/search/VUE.JS/1.htm">VUE.JS</a><a class="tag" taget="_blank" href="/search/%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5/1.htm">入门与实践</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Vue.js配置Babel、Webpack和ESLint今天我们来聊聊如何配置Babel、Webpack和ESLint,这三个工具在现代前端开发中扮演着重要角色。它们分别负责代码转译、模块打包和代码质量检测,合理配置它们能大大提高项目的开发效率和质量。下面我将详细介绍它们的作用,并提供具体的配置示例。1.Babel配置Babel主要用于将现代JavaScript(ES6+)代码转译为兼容性更好的版</div> </li> <li><a href="/article/1890955843965349888.htm" title="Openshift或者K8S上部署xxl-job" target="_blank">Openshift或者K8S上部署xxl-job</a> <span class="text-muted">RedCong</span> <a class="tag" taget="_blank" href="/search/openshift/1.htm">openshift</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>本案例以版本2.3.0为例1.packagejarbysourcecodesourcecode:https://github.com/xuxueli/xxl-job/blob/2.3.0/2.initmysqldatabasesqlcode:https://github.com/xuxueli/xxl-job/blob/2.3.0/doc/db/tables_xxl_job.sql3.buildi</div> </li> <li><a href="/article/1890950925829337088.htm" title="python工作目录与文件目录" target="_blank">python工作目录与文件目录</a> <span class="text-muted">我家大宝最可爱</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>总结open函数中的相对路径是以工作目录为基准的import导入package时,相对路径是以当前执行import的文件路径为基准的由于python规定顶层模块不能作为package,因此import只能导入当前文件所在的目录以及子路下的package,无法导入上层目录的pakcage,例如import..xxx是不行的,只能是importx或者importx.y想要导入上层目录的package,</div> </li> <li><a href="/article/1890937683962818560.htm" title="android jetpack,Android Jetpack应用指南" target="_blank">android jetpack,Android Jetpack应用指南</a> <span class="text-muted">comparethecloud</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/jetpack/1.htm">jetpack</a> <div>第1章初识Jetpack11.1Android应用程序架构设计标准的缺失概论11.2什么是Jetpack21.3Jetpack与AndroidX31.4迁移至AndroidX41.5新建项目默认支持AndroidX61.6总结8第2章LifeCycle92.1LifeCycle的诞生92.2使用LifeCycle解耦页面与组件102.2.1案例分析102.2.2LifeCycle的原理112.2.</div> </li> <li><a href="/article/1890935788707835904.htm" title="对界面简单易用封装SDK" target="_blank">对界面简单易用封装SDK</a> <span class="text-muted">荭色海湾</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6%E5%AE%9E%E6%88%98/1.htm">中间件实战</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1.两大接口1.CheckTuplepackagecom.x.globalcommonservice.model.permissioncontrolservice.openfga.service;importcom.x.globalcommonservice.global.exception.CodeException;importcom.x.globalcommonservice.model.p</div> </li> <li><a href="/article/1890935662463479808.htm" title="android studio build异常" target="_blank">android studio build异常</a> <span class="text-muted">JavaPub-rodert</span> <a class="tag" taget="_blank" href="/search/ERROR%E8%A7%A3%E5%86%B3/1.htm">ERROR解决</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android-studio/1.htm">android-studio</a> <div>文章目录异常解决异常ERROR:FailedtoinstallthefollowingAndroidSDKpackagesassomelicenceshavenotbeenaccepted.platforms;android-28AndroidSDKPlatform28build-tools;28.0.2AndroidSDKBuild-Tools28.0.2Tobuildthisproject,a</div> </li> <li><a href="/article/1890928727014043648.htm" title="2024年最新Android Jetpack Compose开发指南及实战教程_jetpack compose pdf" target="_blank">2024年最新Android Jetpack Compose开发指南及实战教程_jetpack compose pdf</a> <span class="text-muted">2401_86391835</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/jetpack/1.htm">jetpack</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>这里免费分享一份阿里P7架构师和谷歌技术团队共同整理的JetpackCompose指南及实战教程,来帮助读者规划出从入门到精通的最佳学习路径。在对知识点细致的讲解之外,书中还穿插了大量示例代码和最佳实践,对于Compose的初/中级读者极具学习和参考价值。AndroidJetpackCompose开发应用指南第⼀章初识JetpackJetPack是什么JetPack和AndroidXAndroid</div> </li> <li><a href="/article/1890928600656441344.htm" title="Android架构开发进阶指南,Android Jetpack Compose强化实战_android compose架构" target="_blank">Android架构开发进阶指南,Android Jetpack Compose强化实战_android compose架构</a> <span class="text-muted">2401_84537646</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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/jetpack/1.htm">jetpack</a> <div>在我们日常的开发中,如果所有人各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。而这时,许多人就会使用Jetpack这个由多个库组成的套件,来减少样板代码,以便将精力更多的集中于重要的编码工作上面。统一的架构模式通常会给我们带来诸多好处,如:统一开发规范,使得代码整洁、规范,后续易于维护及扩展提高开发效率(尤其在团队人员较多时)模块单一职责,使得模块专注自己内部(面向对象),模块</div> </li> <li><a href="/article/1890923050266849280.htm" title="Golang使用Redis与连接池" target="_blank">Golang使用Redis与连接池</a> <span class="text-muted">  T</span> <a class="tag" taget="_blank" href="/search/GoLang/1.htm">GoLang</a><a class="tag" taget="_blank" href="/search/Redis/1.htm">Redis</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>使用下载go的redis包gogetgithub.com/gomodule/redigo/redis如果网不好的话就很费劲了packagemainimport("fmt""github.com/gomodule/redigo/redis"//引入redis包)funcmain(){//连接数据源rediss,err:=redis.Dial("tcp","127.0.01:6379")iferr!=</div> </li> <li><a href="/article/1890907160888537088.htm" title="cmake 编译找不到 Qt5WebKitConfig.cmake" target="_blank">cmake 编译找不到 Qt5WebKitConfig.cmake</a> <span class="text-muted">SimpleForest</span> <a class="tag" taget="_blank" href="/search/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/1.htm">杂七杂八</a> <div>用cmake编译时出现如下错误提示:CMakeErroratCMakeLists.txt:313(FIND_PACKAGE):Bynotproviding"FindQt5WebKit.cmake"inCMAKE_MODULE_PATHthisprojecthasaskedCMaketofindapackageconfigurationfileprovidedby"Qt5WebKit",butCMa</div> </li> <li><a href="/article/1890885983700840448.htm" title="webpack 性能优化方案总结" target="_blank">webpack 性能优化方案总结</a> <span class="text-muted">carpe diem xt</span> <a class="tag" taget="_blank" href="/search/my_vue/1.htm">my_vue</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</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/vue.js/1.htm">vue.js</a> <div>一、可视化查看打包大小webpack-bundle-analyzer1.1简介主要是用来可视化查看包的大小1.2安装npminstall--save-devwebpack-bundle-analyzer1.3使用方式1、在webpack配置文件配置2、使用require引入constBundleAnalyzerPlugin=require('webpack-bundle-analyzer').Bu</div> </li> <li><a href="/article/1890884220620959744.htm" title="Webpack 打包性能优化指南" target="_blank">Webpack 打包性能优化指南</a> <span class="text-muted">不知名靓仔</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</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>引言Webpack是一款非常强大的模块打包工具,它能够将各种资源(如JS、CSS、图片等)打包成一个或多个浏览器可以理解的文件。然而,在处理大型项目时,Webpack的打包速度可能会变得相当慢,这直接影响到了开发效率。本文将介绍一些实用的技巧和最佳实践,帮助你优化Webpack的打包性能。1.Webpack基础1.1什么是Webpack?Webpack是一个模块打包器,它能够分析项目的依赖关系图,</div> </li> <li><a href="/article/1890877538746560512.htm" title="探索时间的脉络:Vue.js下的Timeline组件——Timeline Vuejs" target="_blank">探索时间的脉络:Vue.js下的Timeline组件——Timeline Vuejs</a> <span class="text-muted">房耿园Hartley</span> <div>探索时间的脉络:Vue.js下的Timeline组件——TimelineVuejs项目地址:https://gitcode.com/gh_mirrors/ti/timeline-vuejs在数字时代,将信息以时间轴的形式展示变得日益重要,它帮助我们清晰地追踪事件的发展和变迁。今天,我们要推荐一个精巧且功能强大的Vue.js组件——TimelineVuejs。这款开源项目专为Vue爱好者设计,旨在优</div> </li> <li><a href="/article/1890877033727193088.htm" title="vue框架生命周期详细解析" target="_blank">vue框架生命周期详细解析</a> <span class="text-muted">黑码小帅</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%B7%B1%E6%80%BB%E7%BB%93/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/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</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/js/1.htm">js</a> <div>Vue.js的生命周期钩子函数是理解Vue组件行为的关键。每个Vue实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段,每个阶段都有对应的钩子函数,开发者可以在这些钩子函数中执行特定的操作。Vue生命周期概述Vue的生命周期可以分为以下几个主要阶段:创建阶段(Creation)挂载阶段(Mounting)更新阶段(Updating)销毁阶段(Destruction)每个阶段都有对应的钩子函数</div> </li> <li><a href="/article/1890872621805924352.htm" title="Webpack相关优化总结" target="_blank">Webpack相关优化总结</a> <span class="text-muted">问白</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">前端工程化</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</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%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">前端工程化</a> <div>在使用webpack时提供了各种配置,这里结合在业务中常用的配置汇总一下可以进行的一系列的webpack优化缩小文件搜索范围其原理是在构建时,会以用户配置的Entry为开始依次递归遍历每个Module,在遍历每个Module时会调用相应合适的Loader对原模块代码进行“翻译”。优化Loader配置Loader对文件的转换是比较耗时的,我们可以在loader中通过test、include、excl</div> </li> <li><a href="/article/104.htm" title="springmvc 下 freemarker页面枚举的遍历输出" target="_blank">springmvc 下 freemarker页面枚举的遍历输出</a> <span class="text-muted">杨白白</span> <a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a> <div>spring mvc freemarker 中遍历枚举 1枚举类型有一个本地方法叫values(),这个方法可以直接返回枚举数组。所以可以利用这个遍历。 enum public enum BooleanEnum { TRUE(Boolean.TRUE, "是"), FALSE(Boolean.FALSE, "否"); </div> </li> <li><a href="/article/231.htm" title="实习简要总结" target="_blank">实习简要总结</a> <span class="text-muted">byalias</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>来白虹不知不觉中已经一个多月了,因为项目还在需求分析及项目架构阶段,自己在这段 时间都是在学习相关技术知识,现在对这段时间的工作及学习情况做一个总结: (1)工作技能方面 大体分为两个阶段,Java Web 基础阶段和Java EE阶段 1)Java Web阶段 在这个阶段,自己主要着重学习了 JSP, Servlet, JDBC, MySQL,这些知识的核心点都过 了一遍,也</div> </li> <li><a href="/article/358.htm" title="Quartz——DateIntervalTrigger触发器" target="_blank">Quartz——DateIntervalTrigger触发器</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2208559 一.概述 simpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致他有不适合调度的定时任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger,间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间</div> </li> <li><a href="/article/485.htm" title="Unix快捷键" target="_blank">Unix快捷键</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/Unix%EF%BC%9B%E5%BF%AB%E6%8D%B7%E9%94%AE%3B/1.htm">Unix;快捷键;</a> <div>复制,删除,粘贴: dd:删除光标所在的行                             &nbs</div> </li> <li><a href="/article/612.htm" title="获取Android设备屏幕的相关参数" target="_blank">获取Android设备屏幕的相关参数</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>包含屏幕的分辨率  以及 屏幕宽度的最大dp 高度最大dp   TextView text = (TextView)findViewById(R.id.text); DisplayMetrics dm = new DisplayMetrics(); text.append("getResources().ge</div> </li> <li><a href="/article/739.htm" title="要做物联网?先保护好你的数据" target="_blank">要做物联网?先保护好你的数据</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE/1.htm">数据</a> <div>根据Beecham Research的说法,那些在行业中希望利用物联网的关键领域需要提供更好的安全性。 在Beecham的物联网安全威胁图谱上,展示了那些可能产生内外部攻击并且需要通过快速发展的物联网行业加以解决的关键领域。 Beecham Research的技术主管Jon Howes说:“之所以我们目前还没有看到与物联网相关的严重安全事件,是因为目前还没有在大型客户和企业应用中进行部署,也就</div> </li> <li><a href="/article/866.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>        整数之间的取模求余运算很好求,但几乎没有遇到过对负数进行取模求余,直接看下面代码: /** * * @author Logic * */ public class Test { public static void main(String[] args) { // TODO A</div> </li> <li><a href="/article/993.htm" title="SQL注入介绍" target="_blank">SQL注入介绍</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/sql%E6%B3%A8%E5%85%A5/1.htm">sql注入</a> <div>二、SQL注入范例 这里我们根据用户登录页面 <form action="" > 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="passwor</div> </li> <li><a href="/article/1120.htm" title="优雅代码风格" target="_blank">优雅代码风格</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a> <div>总结了几点关于优雅代码风格的描述: 代码简单:不隐藏设计者的意图,抽象干净利落,控制语句直截了当。 接口清晰:类型接口表现力直白,字面表达含义,API 相互呼应以增强可测试性。 依赖项少:依赖关系越少越好,依赖少证明内聚程度高,低耦合利于自动测试,便于重构。 没有重复:重复代码意味着某些概念或想法没有在代码中良好的体现,及时重构消除重复。 战术分层:代码分层清晰,隔离明确,</div> </li> <li><a href="/article/1247.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/%E5%B8%83%E5%B0%94%E6%95%B0%E7%BB%84/1.htm">布尔数组</a> <div>  androi中提到了布尔数组;   布尔数组默认的是false,  并且只会打印false或者是true   布尔数组的例子;  根据字符数组创建布尔数组 char[] c = {'p','u','b','l','i','c'}; //根据字符数组的长度创建布尔数组的个数 boolean[] b = new bool</div> </li> <li><a href="/article/1374.htm" title="web.xml之welcome-file-list、error-page" target="_blank">web.xml之welcome-file-list、error-page</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/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/error-page/1.htm">error-page</a> <div>welcome-file-list 1.定义: <welcome-file-list> <welcome-file>login.jsp</welcome> </welcome-file-list>  2.作用:用来指定WEB应用首页名称。   error-page1.定义: <error-page&g</div> </li> <li><a href="/article/1501.htm" title="richfaces 4 fileUpload组件删除上传的文件" target="_blank">richfaces 4 fileUpload组件删除上传的文件</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/clear/1.htm">clear</a><a class="tag" taget="_blank" href="/search/Richfaces+4/1.htm">Richfaces 4</a><a class="tag" taget="_blank" href="/search/fileupload/1.htm">fileupload</a> <div> 页面代码               <h:form id="fileForm">            <rich:</div> </li> <li><a href="/article/1628.htm" title="技术文章备忘" target="_blank">技术文章备忘</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0/1.htm">技术文章</a> <div>Zookeeper http://wenku.baidu.com/view/bab171ffaef8941ea76e05b8.html http://wenku.baidu.com/link?url=8thAIwFTnPh2KL2b0p1V7XSgmF9ZEFgw4V_MkIpA9j8BX2rDQMPgK5l3wcs9oBTxeekOnm5P3BK8c6K2DWynq9nfUCkRlTt9uV</div> </li> <li><a href="/article/1755.htm" title="org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1解决方案" target="_blank">org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1解决方案</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>文章摘自:http://blog.csdn.net/yangwawa19870921/article/details/7553181   在编写HQL时,可能会出现这种代码: select a.name,b.age from TableA a left join TableB b on a.id=b.id  如果这是HQL,那么这段代码就是错误的,因为HQL不支持</div> </li> <li><a href="/article/1882.htm" title="sqlserver按照字段内容进行排序" target="_blank">sqlserver按照字段内容进行排序</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/%E6%8C%89%E7%85%A7%E5%86%85%E5%AE%B9%E6%8E%92%E5%BA%8F/1.htm">按照内容排序</a> <div>在做项目的时候,遇到了这样的一个需求:           从数据库中取出的数据集,首先要将某个数据或者多个数据按照地段内容放到前面显示,例如:从学生表中取出姓李的放到数据集的前面;          select * fro</div> </li> <li><a href="/article/2009.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/%E7%BC%96%E7%A8%8B%E7%8F%A0%E7%8E%91/1.htm">编程珠玑</a> <div> import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Random; public class BitMapSearch { </div> </li> <li><a href="/article/2136.htm" title="Java关于==和equals" target="_blank">Java关于==和equals</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>关于==和equals概念其实很简单,一个是比较内存地址是否相同,一个比较的是值内容是否相同。虽然理解上不难,但是有时存在一些理解误区,如下情况: 1、 String a = "aaa"; a=="aaa"; ==> true 2、 new String("aaa")==new String("aaa</div> </li> <li><a href="/article/2263.htm" title="[IT与资本]软件行业需对外界投资热情保持警惕" target="_blank">[IT与资本]软件行业需对外界投资热情保持警惕</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/it/1.htm">it</a> <div>       我还是那个看法,软件行业需要增强内生动力,尽量依靠自有资金和营业收入来进行经营,避免在资本市场上经受各种不同类型的风险,为企业自主研发核心技术和产品提供稳定,温和的外部环境...       如果我们在自己尚未掌握核心技术之前,企图依靠上市来筹集资金,然后使劲往某个领域砸钱,然</div> </li> <li><a href="/article/2390.htm" title="oracle 数据块结构" target="_blank">oracle 数据块结构</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/%E5%9D%97/1.htm">块</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%9D%97/1.htm">数据块</a><a class="tag" taget="_blank" href="/search/%E5%9D%97%E7%BB%93%E6%9E%84/1.htm">块结构</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E7%9B%AE%E5%BD%95/1.htm">行目录</a> <div>oracle 数据块是数据库存储的最小单位,一般为操作系统块的N倍。其结构为: 块头--〉空行--〉数据,其实际为纵行结构。 块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。同一数据库中,Oracle9i及以上版本支持同一数据库中同时使用标</div> </li> <li><a href="/article/2517.htm" title="github上一些觉得对自己工作有用的项目收集" target="_blank">github上一些觉得对自己工作有用的项目收集</a> <span class="text-muted">dengkane</span> <a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>github上一些觉得对自己工作有用的项目收集 技能类 markdown语法中文说明 回到顶部 全文检索 elasticsearch bigdesk elasticsearch管理插件 回到顶部 nosql mapdb 支持亿级别map, list, 支持事务. 可考虑做为缓存使用 C</div> </li> <li><a href="/article/2644.htm" title="初二上学期难记单词二" target="_blank">初二上学期难记单词二</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a> <div>dangerous 危险的 panda 熊猫 lion 狮子 elephant 象 monkey 猴子 tiger 老虎 deer 鹿 snake 蛇 rabbit 兔子 duck 鸭 horse 马 forest 森林 fall 跌倒;落下 climb 爬;攀登 finish 完成;结束 cinema 电影院;电影 seafood 海鲜;海产食品 bank 银行</div> </li> <li><a href="/article/2771.htm" title="8、mysql外键(FOREIGN KEY)的简单使用" target="_blank">8、mysql外键(FOREIGN KEY)的简单使用</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>一、基本概念 1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。 2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。 3、如</div> </li> <li><a href="/article/2898.htm" title="java循环标签 Foreach" target="_blank">java循环标签 Foreach</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/%E6%A0%87%E7%AD%BE/1.htm">标签</a><a class="tag" taget="_blank" href="/search/java%E5%BE%AA%E7%8E%AF/1.htm">java循环</a><a class="tag" taget="_blank" href="/search/foreach/1.htm">foreach</a> <div>1. 简单的for循环 public static void main(String[] args) { for (int i = 1, y = i + 10; i < 5 && y < 12; i++, y = i * 2) { System.err.println("i=" + i + " y=" </div> </li> <li><a href="/article/3025.htm" title="Spring Security(05)——异常信息本地化" target="_blank">Spring Security(05)——异常信息本地化</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a><a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF/1.htm">异常信息</a><a class="tag" taget="_blank" href="/search/%E6%9C%AC%E5%9C%B0%E5%8C%96/1.htm">本地化</a> <div>异常信息本地化          Spring Security支持将展现给终端用户看的异常信息本地化,这些信息包括认证失败、访问被拒绝等。而对于展现给开发者看的异常信息和日志信息(如配置错误)则是不能够进行本地化的,它们是以英文硬编码在Spring Security的代码中的。在Spring-Security-core-x</div> </li> <li><a href="/article/3152.htm" title="DUBBO架构服务端告警Failed to send message Response" target="_blank">DUBBO架构服务端告警Failed to send message Response</a> <span class="text-muted">javamingtingzhao</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/DUBBO/1.htm">DUBBO</a> <div> 废话不多说,警告日志如下,不知道有哪位遇到过,此异常在服务端抛出(服务器启动第一次运行会有这个警告),后续运行没问题,找了好久真心不知道哪里错了。    WARN 2015-07-18 22:31:15,272 com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(84)</div> </li> <li><a href="/article/3279.htm" title="JS中Date对象中几个用法" target="_blank">JS中Date对象中几个用法</a> <span class="text-muted">leeqq</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E5%90%8E%E4%B8%80%E5%A4%A9/1.htm">最后一天</a> <div>近来工作中遇到这样的两个需求 1. 给个Date对象,找出该时间所在月的第一天和最后一天 2. 给个Date对象,找出该时间所在周的第一天和最后一天   需求1中的找月第一天很简单,我记得api中有setDate方法可以使用 使用setDate方法前,先看看getDate var date = new Date(); console.log(date); // Sat J</div> </li> <li><a href="/article/3406.htm" title="MFC中使用ado技术操作数据库" target="_blank">MFC中使用ado技术操作数据库</a> <span class="text-muted">你不认识的休道人</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mfc/1.htm">mfc</a> <div>1.在stdafx.h中导入ado动态链接库 #import"C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","end")2.在CTestApp文件的InitInstance()函数中domodal之前写::CoIniti</div> </li> <li><a href="/article/3533.htm" title="Android Studio加速" target="_blank">Android Studio加速</a> <span class="text-muted">rensanning</span> <a class="tag" taget="_blank" href="/search/android+studio/1.htm">android studio</a> <div>Android Studio慢、吃内存!启动时后会立即通过Gradle来sync & build工程。 (1)设置Android Studio a) 禁用插件 File -> Settings...  Plugins 去掉一些没有用的插件。 比如:Git Integration、GitHub、Google Cloud Testing、Google Cloud</div> </li> <li><a href="/article/3660.htm" title="各数据库的批量Update操作" target="_blank">各数据库的批量Update操作</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/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a> <div>MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了。本篇仅记录批量update操作的 sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了。   注意:下列批量更新语句都是作为一个事务整体执行,要不全部成功,要不全部回滚。 MSSQL的SQL语句  WITH R AS(   SELECT 'John' as name, 18 as</div> </li> <li><a href="/article/3787.htm" title="html禁止清除input文本输入缓存" target="_blank">html禁止清除input文本输入缓存</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/input/1.htm">input</a> <div>多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocomplete="off"; eg: <input type="text" autocomplete="off" name</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><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>