栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

webpack一些基础知识点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

webpack一些基础知识点

webpack一些基础知识点 核心概念
  • Entry : 入口,执行构建的第一步
  • Module : 会从配置的Entry开始递归找出所有依赖的模块
  • Chunk :用于代码的分割与合并
  • Loader:模块转换器
  • Plugin:扩展插件,在特定时机注入扩展逻辑改变构建结果
  • Output:输出结果

webpack是对jacascript打包的工具,不能识别其他的文件,所以需要配置loader进行识别

前言 项目目录结构
├─build
│  ├─webpack.base.conf.js    //开发环境和生产环境都有的操作配置文件
│  ├─webpack.dev.conf.js     //开发环境配置文件
│  ├─webpack.prod.conf.js    //生产环境配置文件
│  ├─webpack.rules.conf.js   //模块匹配规则
├─node_modules               //依赖文件
├─public                     //静态文件存储位置
|  |-index.html             //项目模板文件
└─src                 
|  ├─plugins
|  ├─router
|  ├─store
|  ├─views
|  |-App.vue
|  |-main.ts
|  |-shims-vue.d.ts
|-.env.dev               //环境文件
|-.env.test
|-.env.prod
|-.gitigore
|-babel.config.js        //bable配置文件
|-package.json           
|-postcss.config.js     //适配规则
|-tsconfig.json     
1. 第一步初始化项目
yarn init -y 初始化项目  //-y是都回答yes 一键初始化
2. 第二步安装webpack三件套
// 安装webpack三件套
yarn add webpack webpack-cli webpack-dev-server -D  
// -D 等价于--save-dev开发环境时的依赖
// -S 等价于--save生产环境时的依赖

//使用http://localhost:8080/webpack-dev-server/可以访问webpack-dev-server命令在 内存中生成的文件
3. 创建配置文件,分功能创建
├─build
│  ├─webpack.base.conf.js   //公共配置
│  ├─webpack.dev.conf.js    //mode为development配置
│  ├─webpack.prod.conf.js   //mode为production配置
│  ├─webpack.rules.conf.js  //loader配置
3.1 创建src文件夹,并在里面创建main.js文件 3.2书写入口路径和输出路径
//webpack.base.conf.js
const path = require("path")

module.exports = function (proMode) {
    return {
        // JavaScript 执行入口文件
        entry: path.resolve(__dirname, "../src/main.ts"),
        output: {
             // 输出文件都放到 dist 目录下
            path: path.resolve(__dirname, "../dist"),
            // 把所有依赖的模块合并输出到一个 bundle.js 文件
            filename: "./js/[name].[chunkhash].js",
            // publicPath: "./",//生产环境时使用
            clean: true
        },
    }
}
4 创建环境文件
.env.dev
.env.test
.env.prod
4.1 书写环境内容
//.env.dev
NODE_ENV="development"
VUE_APP_BASE_API="/api"
VUE_APP_API_USER="/user"
VUE_APP_SHOWCONSOLE=true
4.2 配置环境变量
//Dotenv是一个零依赖模块,它将环境变量中的变量从.env文件加载到process.env中
// 安装dotenv
yarn add dotenv -D
yarn add cross-env -D

//webpack.base.conf.js
const webpack = require("webpack")
const envMode = process.env.envMode
require("dotenv").config({
    path: `.env.${envMode}`
})
const prefixRE = /^VUE_APP_/
let env = {}
for (const key in process.env) {
    if (key == "NODE_ENV" || key == "BASE_URL" || prefixRE.test(key)) {
        env[key] = JSON.stringify(process.env[key])
    }
}

module.exports = function (proMode) {
    return {
        
        plugins: [
            new webpack.DefinePlugin({ // 定义环境和变量
                'process.env': {
                    ...env
                }
            }),

        ],
    }
}
4.3 修改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"
},
  • cross-env:运行跨平台设置和使用环境变量的脚本
  • –config:使用哪个配置文件
  • –color :开启控制台颜色
5 es6=>es5
//安装babel
yarn add @babel/core @babel/preset-env babel-loader -D
yarn add core-js -S
5.1 匹配js进行转换
//webpack.rules.conf.js
module.exports = function (proMode) {
    return [{
            test: /.(t|j)s$/,
            exclude: /node_modules/,
            use: {
                loader: "babel-loader",
                options: {
                    cacheDirectory: true
                }
            }
        },
    ]
}
5.2 安装TypeScript并使用babel进行转换
//安装ts
yarn add typescript -D
// 解析 typescript 的 babel 预
yarn add @babel/preset-typescript -D
//polyfill 箭头函数
yarn add @babel/plugin-transform-runtime -D
//支持 ts 类的写法
yarn add @babel/plugin-proposal-class-properties -D
//支持三点展开符
yarn add @babel/plugin-proposal-object-rest-spread -D
yarn add @babel/runtime @babel/runtime-corejs3 core-js -S
5.3 创建babel.config.js
const presets = [
    [
        "@babel/preset-env", {
            "useBuiltIns": "usage",
            "corejs": "3.19.1"
        }
    ],
    [
        '@babel/preset-typescript', // 引用Typescript插件
        {
            allExtensions: true, // 支持所有文件扩展名,否则在vue文件中使用ts会报错
        },
    ],
]
const plugins = [
    //按需引入vant组件
    [
        "import",
        {
            "libraryName": "vant",
            "libraryDirectory": "es",
            "style": true
        }, "vant"
    ],
    [
        '@babel/plugin-transform-runtime',
        {
            corejs: 3,
        },
    ],
    '@babel/proposal-class-properties',
    '@babel/proposal-object-rest-spread',

]
module.exports = {
    plugins,
    presets
}
6 自动生成HTML文件
yarn add html-webpack-plugin -D
6.1 html-webpack-plugin配置
//webpack.base.conf.js
const HtmlWebpackPlugin = require("html-webpack-plugin");

const cdn = {
    dev: {
        css: [],
        js: []
    },
    prod: {
        css: [],
        js: [
            'https://lib.baomitu.com/vue/3.0.11/vue.runtime.global.prod.js',
            "https://lib.baomitu.com/vue-router/4.0.6/vue-router.global.prod.min.js",
            "https://lib.baomitu.com/vuex/4.0.0/vuex.global.prod.min.js"
        ]
    }
}

module.exports = function (proMode) {
    return {
        plugins: [
            new HtmlWebpackPlugin({
                template: path.resolve(__dirname, "../public/index.html"),  //引用模板位置
                filename: "index.html",  //生成的html,路径相对于output.path
                title: "webpack+vue3",
                minify: {

                    collapseWhitespace: true,  //是否折叠空白
                    preserveLineBreaks: false,  
                    minifyCSS: true,	//是否压缩
                    minifyJS: true,
                    removeComments: false
                },
                files: proMode ? cdn.prod : cdn.dev  
            }),
        ],
    }
}
6.2 创建public文件夹,在里面创建index.html
// public/index.html
//需将模板中的  标签里的内容改成 
<%= htmlWebpackPlugin.options.title %>
    
    
//CDN引入js
<% for (var i in
htmlWebpackPlugin.options.files&&htmlWebpackPlugin.options.files.js) {<!-- --> %>
<script src="<%= htmlWebpackPlugin.options.files.js[i] %>"></script>
<% } %>
</pre> 
7 添加css支持和less支持 
<pre class="brush:java;toolbar:false">//css-loader提取.css的内容    
//style-loader把.css的内容按照javascript中的字符串存储起来,在网页执行javascript时通过DOM操作动态的往HTML HEAD标签里插入style标签

yarn add style-loader css-loader -D
yarn add less less-loader -D
yarn add autoprefixer postcss-loader -D 
</pre> 
7.1 使用loader配置 
<pre class="brush:java;toolbar:false">//webpack.rules.conf.js
module.exports = function (proMode) {<!-- -->
    return [
        {<!-- -->
            test: /.less/,
            use: [MiniCssExtractPlugin.loader,
                "css-loader",
                {<!-- -->
                    loader: "postcss-loader",
                    options: {<!-- -->
                        postcssOptions: {<!-- -->
                            ident: "postcss",
                            plugin: () => {<!-- -->
                                require("postcss-preset-env")()
                            }
                        }
                    }
                }, "less-loader"
            ]
        },
        {<!-- -->
            test: /.css$/,
            use: [
                // "style-loader",
                MiniCssExtractPlugin.loader,
                "css-loader",
                {<!-- -->
                    loader: "postcss-loader",
                    options: {<!-- -->
                        postcssOptions: {<!-- -->
                            ident: "postcss",
                            plugin: () => {<!-- -->
                                require("postcss-preset-env")()
                            }
                        }
                    }
                },
                // "less-loader"
            ]
        }
    ]
}
</pre> 
<p>loader从后往前执行</p> 
8. 配置alias别名和扩展名 
<pre class="brush:java;toolbar:false">//webpack.base.conf.js
resolve: {<!-- -->
    alias: {<!-- -->
        "@": path.resolve(__dirname, "../src")
    },
        
         //扩展名书写
 		//把项目中所有的扩展名都写上去,要不然会报错
        extensions: [".js", ".vue", ".ts"]
},                 
</pre> 
8.1 resolveLoader 
<pre class="brush:java;toolbar:false">//配置loader的解析规则
resolveLoader:{
	//loader的寻找目录
	modules:[
		'node_modules',
		
	]
}
</pre> 
9. 打包时清除上次构建dist目录 
<pre class="brush:java;toolbar:false">//webpack.base.conf.js
output: {<!-- -->
            clean: true
        },
</pre> 
10 识别.vue文件 
<pre class="brush:java;toolbar:false">yarn add vue-loader@next @vue/compiler-sfc -D
yarn add vue@next -S
</pre> 
<ul><li>vue-loader:解析转换.vue文件,提取出js/style/html模板</li><li>@vue/compiler-sfc,vue-loader调用它对文件内容转换成webpack模块化的import形式,转换成AST抽象语法树</li></ul> 
10.1 配置匹配规则 
<pre class="brush:java;toolbar:false">// webpack.rules.conf.js
rules: [
    {<!-- -->
        test: /.vue$/,
        use: [
            'vue-loader'
        ]
    }
]

//webpack.base.conf.js
const {<!-- --> VueLoaderPlugin } = require('vue-loader/dist/index');
plugins: [
    new VueLoaderPlugin()
]

</pre> 
10.2 添加App.vue 
<pre class="brush:java;toolbar:false"><template>
    <div id="app">
        <div id="nav" v-if="!$route.meta.hide">
            <router-link to="/">Home</router-link>|
            <router-link to="/about">About</router-link>
        </div>
        <keep-alive>
            <router-view
                v-if="$route.meta.keepAlive"
                class="router"
            ></router-view>
        </keep-alive>
        <router-view v-if="!$route.meta.keepAlive" class="router"></router-view>
    </div>
</template>
<script>
import {<!-- --> defineComponent, computed } from "vue";
import {<!-- --> useStore } from "vuex";
export default defineComponent({<!-- -->
    setup() {<!-- -->
        const store = useStore();
        return {<!-- -->
            title: computed(() => store.state.title),
        };
    },
});
</script>
<style lang="less">
// @import "style/_variables.scss";
#app {<!-- -->
    // font-family: "Avenir", Helvetica, Arial, sans-serif;
    // -webkit-font-smoothing: antialiased;
    // -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
}
#nav {<!-- -->
    padding: 20px 0;
    a {<!-- -->
        font-weight: bold;
        color: #2c3e50;
        font-size: 32px;
        &.router-link-exact-active {<!-- -->
            color: red;
        }
    }
}
h3 {<!-- -->
    font-size: 18px;
}
a {<!-- -->
}
</style>
</pre> 
10.3 修改main.ts 
<pre class="brush:java;toolbar:false">import {<!-- --> createApp } from 'vue' // Vue 3.x 引入 vue 的形式
import App from './App.vue' // 引入 APP 页面组建
 
const app = createApp(App) // 通过 createApp 初始化 app
app.mount('#app') // 将页面挂载到 root 节点
</pre> 
10.4 创建vue类型声明文件 
<pre class="brush:java;toolbar:false"> src/shims-vue.d.ts
declare module "*.vue" {<!-- -->
  import type {<!-- --> DefineComponent } from "vue";
  const component: DefineComponent<{<!-- -->}, {<!-- -->}, any>;
  export default component;
}
</pre> 
10.5 .vue文件一直报错,声明文件没生效 
<pre class="brush:java;toolbar:false">//tsconfig.js
//includes把声明文件的路径加上,就不会了报错了

"types": ["./src/shims-vue.d.ts"],  
</pre> 
11. 安装vue全家桶 
<pre class="brush:java;toolbar:false"> yarn add vue-router@4 vuex@next axios -S
</pre> 
12. 集成Vant 
<pre class="brush:java;toolbar:false">yarn add vant@next -S

//按需引入
yarn add babel-plugin-import -D

// babel.config.js
const plugins = [
    ['import', {<!-- -->
        libraryName: 'vant',
        libraryDirectory: 'es',
        style: true
    }, 'vant']
]

//在搭建脚手架的同时,要区分css文件和less文件 
//vant组件不能使用less-loader去识别,会报错
</pre> 
13. 识别图片 
<pre class="brush:java;toolbar:false">//webpack.conf.rules.js
module.exports = function (proMode) {<!-- -->
    return [
        {<!-- -->
            test: /.(png|jpg|svg|gif)$/,
            type: "asset/resource",
            generator: {<!-- -->
                filename: "assets/[hash:8].[name][ext]"
            }
        },
    ]
}
</pre> 
优化 
1.静态文件输出到打包目录下 
<pre class="brush:java;toolbar:false">//使用copy-webpack-plugin插件时 ,要复制的文件夹里不能为空,否则报错

yarn add copy-webpack-plugin -D

//webpack.prod.conf.js
const copyWebpackPlugin = require("copy-webpack-plugin");
const webpackConfigProd = {<!-- -->
    mode: "production",
    plugins: [
        new copyWebpackPlugin({<!-- -->
            patterns: [{<!-- -->
                from: path.resolve(__dirname, "../public"),
                to: "./",
                globOptions: {<!-- -->
                    dot: true,
                    gitignore: true,
                    ignore: ["**/index.html"],
                }
            }]
        }),
    ],
}
</pre> 
2. 提取样式文件 
<pre class="brush:java;toolbar:false">yarn add mini-css-extract-plugin -D

//webpack.base.conf.js
const miniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = function (proMode) {<!-- -->
    return {<!-- -->
        plugins: [
            new miniCssExtractPlugin({<!-- -->
                filename: "./css/[name].[contenthash].css",
            }),
        ],
    }
}



//webpack.rules.conf.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = function (proMode) {<!-- -->
    return [
        {<!-- -->
            test: /.less/,
            use: [MiniCssExtractPlugin.loader,
                "css-loader",
                {<!-- -->
                    loader: "postcss-loader",
                    options: {<!-- -->
                        postcssOptions: {<!-- -->
                            ident: "postcss",
                            plugin: () => {<!-- -->
                                require("postcss-preset-env")()
                            }
                        }
                    }
                }, "less-loader"
            ]
        },
        {<!-- -->
            test: /.css$/,
            use: [
                // "style-loader",
                MiniCssExtractPlugin.loader,
                "css-loader",
                {<!-- -->
                    loader: "postcss-loader",
                    options: {<!-- -->
                        postcssOptions: {<!-- -->
                            ident: "postcss",
                            plugin: () => {<!-- -->
                                require("postcss-preset-env")()
                            }
                        }
                    }
                },
                // "less-loader"
            ]
        }
    ]
}
</pre> 
3. vw适配 
<pre class="brush:java;toolbar:false">yarn add postcss-loader postcss-px-to-viewport -D

//新建postcss.config.js文件
const path = require("path")
module.exports = ({<!-- -->
    file
}) => {<!-- -->
    const designWidth = file.includes(path.join("node_modules", "vant")) ? 375 : 750;
    return {<!-- -->
        plugins: {<!-- -->
            autoprefixer: {<!-- -->
                overrideBrowserslist: [
                    "Android 4.1",
                    "iOS 7.1",
                    "Chrome > 31",
                    "ff > 31",
                    "ie >= 8"
                ]
            },
            "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 // 横屏时使用的视口宽度
            }
        }
    }
}
</pre> 
4. 生产环境去掉console<font color="#00ffff"> 字体改成蓝色了 </font> 
<pre class="brush:java;toolbar:false">//webpack.prod.conf.js
const TerserPlugin = require('terser-webpack-plugin');
const webpackConfigProd = {<!-- -->
    mode: "production",
    optimization: {<!-- -->
        minimize: true,
        minimizer: [
            new TerserPlugin({<!-- -->
                parallel: true,
                extractComments: false,
                terserOptions: {<!-- -->
                    compress: {<!-- -->
                        drop_console: true,
                        drop_debugger: true
                    }
                }
            }),

        ]
    }
}
</pre> 
5. 缓存 
<pre class="brush:java;toolbar:false">//webpack.base.conf.js
module.exports = function (proMode) {<!-- -->
    return {<!-- -->
         cache: {<!-- -->
            type: "filesystem",
             buildDependencies: {<!-- -->
                 config: [__filename]
             }
         },
    }
}
</pre> 
tapable 
1.如何使用 
<p>​ 初始化容器</p> 
<p>​ 注册事件</p> 
<p>​ 触发容器</p> 
2. complier 
<p>​ 插件/plugin是构造函数或者是类</p> 
<p>​ compilation在调用complier时会相应调用</p> 
<p>​ 初始化compilation钩子</p> 
<p>​ 添加资源</p> 
自定义webpack 
1.定义一个函数,返回值为一个compiler类 
2.编写compiler类 
<p>​ 初始化配置</p> 
<p>​ 获取入口地址</p> 
<p>​ 读取入口文件内容</p> 
<p>​ 通过@babel/parser将其内容转换为抽象树</p> 
<p>​ 通过@babel/traverse收集依赖</p> 
<p>​ 如果当前文件有依赖</p> 
<p>​ 获取文件路径,生成绝对路径</p> 
<p>​ 同时添加到依赖数组中</p> 
<p>​ 编译代码,将代码中浏览器不能识别的语法进行编译</p> 
<p>​</p> 
3.遍历所有依赖 
4. 生成bundle 
<pre class="brush:java;toolbar:false">定义bundle字符串获取code内容
</pre> 
<p>​ 获取文件绝对路径</p> 
<p>​ 把这个代码写入文件里</p> 
<p>​</p> 
<p>​</p> 
<p>​</p></div>
</div>
<div style="clear: both;"></div>
<div class="author-info fl">
<div><span class="gray">转载请注明:</span>文章转载自 <a href="https://www.mshxw.com/" class="blue">www.mshxw.com</a></div>
<div><span class="gray">本文地址:</span><a href="https://www.mshxw.com/it/993221.html" class="blue">https://www.mshxw.com/it/993221.html</a></div>
</div>
<div class="prev fl">
<p>   <a style='text-align:left;' class='center-block text-center glyphicon glyphicon-collapse-down' href="https://www.mshxw.com/it/993219.html">上一篇  java框架-分布式session解决方案</a>
 </p>
<p>   <a style='text-align:left;' class='center-block text-center glyphicon glyphicon-collapse-down' href="https://www.mshxw.com/it/993215.html">下一篇  DOM介绍</a>
  </p>
</div>
<div class="new_tag fl">
</div>
</div>
<div class="new_r fr" style="border-radius:10px;">
<div class="tui fl">
<h3>Java相关栏目本月热门文章</h3>
<ul>
  <li><span>1</span><a href="https://www.mshxw.com/it/1041277.html" title="【Linux驱动开发】设备树详解(二)设备树语法详解">【Linux驱动开发】设备树详解(二)设备树语法详解</a></li>
  <li><span>2</span><a href="https://www.mshxw.com/it/1041273.html" title="别跟客户扯细节">别跟客户扯细节</a></li>
  <li><span>3</span><a href="https://www.mshxw.com/it/1041266.html" title="Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区">Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区</a></li>
  <li><span>4</span><a href="https://www.mshxw.com/it/1041261.html" title="【Java】对象处理流(ObjectOutputStream和ObjectInputStream)">【Java】对象处理流(ObjectOutputStream和ObjectInputStream)</a></li>
  <li><span>5</span><a href="https://www.mshxw.com/it/1041256.html" title="【分页】常见两种SpringBoot项目中分页技巧">【分页】常见两种SpringBoot项目中分页技巧</a></li>
  <li><span>6</span><a href="https://www.mshxw.com/it/1041299.html" title="一文带你搞懂OAuth2.0">一文带你搞懂OAuth2.0</a></li>
  <li><span>7</span><a href="https://www.mshxw.com/it/1041297.html" title="我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍">我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍</a></li>
  <li><span>8</span><a href="https://www.mshxw.com/it/1041296.html" title="【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成">【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成</a></li>
  <li><span>9</span><a href="https://www.mshxw.com/it/1041294.html" title="JavaSE - 封装、static成员和内部类">JavaSE - 封装、static成员和内部类</a></li>
  <li><span>10</span><a href="https://www.mshxw.com/it/1041291.html" title="树莓派mjpg-streamer实现监控及拍照功能调试">树莓派mjpg-streamer实现监控及拍照功能调试</a></li>
  <li><span>11</span><a href="https://www.mshxw.com/it/1041289.html" title="用c++写一个蓝屏代码">用c++写一个蓝屏代码</a></li>
  <li><span>12</span><a href="https://www.mshxw.com/it/1041285.html" title="从JDK8源码中看ArrayList和LinkedList的区别">从JDK8源码中看ArrayList和LinkedList的区别</a></li>
  <li><span>13</span><a href="https://www.mshxw.com/it/1041281.html" title="idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目">idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目</a></li>
  <li><span>14</span><a href="https://www.mshxw.com/it/1041282.html" title="在openwrt使用C语言增加ubus接口(包含C uci操作)">在openwrt使用C语言增加ubus接口(包含C uci操作)</a></li>
  <li><span>15</span><a href="https://www.mshxw.com/it/1041278.html" title="Spring 解决循环依赖">Spring 解决循环依赖</a></li>
  <li><span>16</span><a href="https://www.mshxw.com/it/1041275.html" title="SpringMVC——基于MVC架构的Spring框架">SpringMVC——基于MVC架构的Spring框架</a></li>
  <li><span>17</span><a href="https://www.mshxw.com/it/1041272.html" title="Andy‘s First Dictionary C++ STL set应用">Andy‘s First Dictionary C++ STL set应用</a></li>
  <li><span>18</span><a href="https://www.mshxw.com/it/1041271.html" title="动态内存管理">动态内存管理</a></li>
  <li><span>19</span><a href="https://www.mshxw.com/it/1041270.html" title="我的创作纪念日">我的创作纪念日</a></li>
  <li><span>20</span><a href="https://www.mshxw.com/it/1041269.html" title="Docker自定义镜像-Dockerfile">Docker自定义镜像-Dockerfile</a></li>
</ul>
</div>
</div>
</div>
<!-- 公共尾部 -->
<div class="link main">
<div class="link_tit">
<span class="on">热门相关搜索</span>
</div>
<div class="link_tab">
<div class="link_con">
<a href="http://www.mshxw.com/TAG_1/luyouqishezhi.html">路由器设置</a>
<a href="http://www.mshxw.com/TAG_1/mutuopan.html">木托盘</a>
<a href="http://www.mshxw.com/TAG_1/baotamianban.html">宝塔面板</a>
<a href="http://www.mshxw.com/TAG_1/shaoerpython.html">儿童python教程</a>
<a href="http://www.mshxw.com/TAG_1/xinqingdiluo.html">心情低落</a>
<a href="http://www.mshxw.com/TAG_1/pengyouquan.html">朋友圈</a>
<a href="http://www.mshxw.com/TAG_1/vim.html">vim</a>
<a href="http://www.mshxw.com/TAG_1/shuangyiliuxueke.html">双一流学科</a>
<a href="http://www.mshxw.com/TAG_1/zhuanshengben.html">专升本</a>
<a href="http://www.mshxw.com/TAG_1/wodexuexiao.html">我的学校</a>
<a href="http://www.mshxw.com/TAG_1/rijixuexiao.html">日记学校</a>
<a href="http://www.mshxw.com/TAG_1/xidianpeixunxuexiao.html">西点培训学校</a>
<a href="http://www.mshxw.com/TAG_1/qixiuxuexiao.html">汽修学校</a>
<a href="http://www.mshxw.com/TAG_1/qingshu.html">情书</a>
<a href="http://www.mshxw.com/TAG_1/huazhuangxuexiao.html">化妆学校</a>
<a href="http://www.mshxw.com/TAG_1/tagouwuxiao.html">塔沟武校</a>
<a href="http://www.mshxw.com/TAG_1/yixingmuban.html">异形模板</a>
<a href="http://www.mshxw.com/TAG_1/xinandaxuepaiming.html">西南大学排名</a>
<a href="http://www.mshxw.com/TAG_1/zuijingpirenshengduanju.html">最精辟人生短句</a>
<a href="http://www.mshxw.com/TAG_1/6bujiaonizhuihuibeipian.html">6步教你追回被骗的钱</a>
<a href="http://www.mshxw.com/TAG_1/nanchangdaxue985.html">南昌大学排名</a>
<a href="http://www.mshxw.com/TAG_1/qingchaoshierdi.html">清朝十二帝</a>
<a href="http://www.mshxw.com/TAG_1/beijingyinshuaxueyuanpaiming.html">北京印刷学院排名</a>
<a href="http://www.mshxw.com/TAG_1/beifanggongyedaxuepaiming.html">北方工业大学排名</a>
<a href="http://www.mshxw.com/TAG_1/beijinghangkonghangtiandaxuepaiming.html">北京航空航天大学排名</a>
<a href="http://www.mshxw.com/TAG_1/shoudoujingjimaoyidaxuepaiming.html">首都经济贸易大学排名</a>
<a href="http://www.mshxw.com/TAG_1/zhongguochuanmeidaxuepaiming.html">中国传媒大学排名</a>
<a href="http://www.mshxw.com/TAG_1/shoudoushifandaxuepaiming.html">首都师范大学排名</a>
<a href="http://www.mshxw.com/TAG_1/zhongguodezhidaxue(beijing)paiming.html">中国地质大学(北京)排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingxinxikejidaxuepaiming.html">北京信息科技大学排名</a>
<a href="http://www.mshxw.com/TAG_1/zhongyangminzudaxuepaiming.html">中央民族大学排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingwudaoxueyuanpaiming.html">北京舞蹈学院排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingdianyingxueyuanpaiming.html">北京电影学院排名</a>
<a href="http://www.mshxw.com/TAG_1/zhongguohuquxueyuanpaiming.html">中国戏曲学院排名</a>
<a href="http://www.mshxw.com/TAG_1/hebeizhengfazhiyexueyuanpaiming.html">河北政法职业学院排名</a>
<a href="http://www.mshxw.com/TAG_1/hebeijingmaodaxuepaiming.html">河北经贸大学排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjinzhongdeyingyongjishudaxuepaiming.html">天津中德应用技术大学排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjinyixuegaodengzhuankexuejiaopaiming.html">天津医学高等专科学校排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjinmeishuxueyuanpaiming.html">天津美术学院排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjinyinlexueyuanpaiming.html">天津音乐学院排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjingongyedaxuepaiming.html">天津工业大学排名</a>
<a href="http://www.mshxw.com/TAG_1/beijinggongyedaxuegengdanxueyuanpaiming.html">北京工业大学耿丹学院排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingjingchaxueyuanpaiming.html">北京警察学院排名</a>
<a href="http://www.mshxw.com/TAG_1/tianjinkejidaxuepaiming.html">天津科技大学排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingyoudiandaxue(hongfujiaoou)paiming.html">北京邮电大学(宏福校区)排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingwanglaozhiyexueyuanpaiming.html">北京网络职业学院排名</a>
<a href="http://www.mshxw.com/TAG_1/beijingdaxueyixuebupaiming.html">北京大学医学部排名</a>
<a href="http://www.mshxw.com/TAG_1/hebeikejidaxuepaiming.html">河北科技大学排名</a>
<a href="http://www.mshxw.com/TAG_1/hebeidezhidaxuepaiming.html">河北地质大学排名</a>
<a href="http://www.mshxw.com/TAG_1/hebeitiyoxueyuanpaiming.html">河北体育学院排名</a>
</div>
</div>
</div>
<div class="footer">
<div class="dl_con">
<div class="width1200">
<dl>
<dt>学习工具</dt>
<dd><a href="https://www.mshxw.com/tools/algebra/" title="代数计算器">代数计算器</a></dd>
<dd><a href="https://www.mshxw.com/tools/trigonometry/" title="三角函数计算器">三角函数</a></dd>
<dd><a href="https://www.mshxw.com/tools/analytical/" title="解析几何">解析几何</a></dd>
<dd><a href="https://www.mshxw.com/tools/solidgeometry/" title="立体几何">立体几何</a></dd>
</dl>
<dl>
<dt>知识解答</dt>
<dd><a href="https://www.mshxw.com/ask/1033/"  title="教育知识">教育知识</a></dd>
<dd><a href="https://www.mshxw.com/ask/1180/"  title="百科知识">百科知识</a></dd>
<dd><a href="https://www.mshxw.com/ask/1155/"  title="生活知识">生活知识</a></dd>
<dd><a class="https://www.mshxw.com/ask/1199/"  title="常识知识">常识知识</a></dd>
</dl>
<dl>
<dt>写作必备</dt>
<dd><a href="https://www.mshxw.com/zuowen/1128/" title="作文大全">作文大全</a></dd>
<dd><a href="https://www.mshxw.com/zuowen/1130/" title="作文素材">作文素材</a></dd>
<dd><a href="https://www.mshxw.com/zuowen/1132/" title="句子大全">句子大全</a></dd>

<dd><a href="https://www.mshxw.com/zuowen/1154/" title="实用范文">实用范文</a></dd>
</dl>
<dl class="mr0">
<dt>关于我们</dt>
<dd><a href="https://www.mshxw.com/about/index.html" title="关于我们" rel="nofollow">关于我们</a></dd>
<dd><a href="https://www.mshxw.com/about/contact.html" title="联系我们" rel="nofollow">联系我们</a></dd>
<dd><a href="https://www.mshxw.com/sitemap/" title="网站地图">网站地图</a></dd>
</dl>
<div class="dl_ewm">
<div class="wx"> <img src="https://www.mshxw.com/skin/sinaskin//kaotop/picture/gzh.jpg" alt="交流群">
<p>名师互学网交流群</p>
</div>
<div class="wx"><img src="https://www.mshxw.com/skin/sinaskin//kaotop/picture/weixin.jpg" alt="名师互学网客服">
<p>名师互学网客服</p>
</div>
</div>
</div>
</div>
<div class="copyright">
<p>名师互学网 版权所有 (c)2021-2022      ICP备案号:<a href="https://beian.miit.gov.cn" rel="nofollow">晋ICP备2021003244-6号</a>
 </p>
</div>
</div>
<!-- 手机端 -->
<div class="m_foot_top">
<img src="https://www.mshxw.com/foot.gif" width="192" height="27" alt="我们一直用心在做"><br/>
<a href="https://www.mshxw.com/about/index.html">关于我们</a>
<a href="https://www.mshxw.com/archiver/">文章归档</a>
<a href="https://www.mshxw.com/sitemap">网站地图</a>
<a href="https://www.mshxw.com/about/contact.html">联系我们</a>
<p>版权所有 (c)2021-2022 MSHXW.COM</p>
<p>ICP备案号:<a href="https://beian.miit.gov.cn/" rel="nofollow">晋ICP备2021003244-6号</a></p>
</div>
<div class="to_top" style="display:none;"><img src="https://www.mshxw.com/skin/sinaskin//kaotop/picture/to_top.png"></div>
<!--广告!-->
<script type="text/javascript" src="https://www.mshxw.com/skin/sinaskin//kaotop/js/top.js"></script>
<script src="https://www.mshxw.com/skin/sinaskin//kaotop/js/fixed.js" type="text/javascript"></script>
<!--头条搜索!-->
<script>
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?018f42187355ee18d1bfcee0487fc91a76ac6319beb05b7dc943033ed22c446d3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
</script>
<!--头条搜索结束!-->
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?e05fec1c87ee5ca07f1ce57d093866c4";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>
</div>
</div>
<script type="text/javascript">
$(".alert_kf").click(function() {
      mantis.requestChat();
 });
</script>
<script type="text/javascript">
var mySwiper_weixin = new Swiper('.pc_swiper_weixin', {
autoplay: 3000, //可选选项,自动滑动
loop: true,
speed: 1000,
pagination: '.swiper-pagination',
paginationClickable: true,
})
</script>
<script type="text/javascript">
$(function() {
$(window).scroll(function() {
if ($(window).scrollTop() > 100) {
$(".to_top").fadeIn(1000);
} else {
$(".to_top").fadeOut(1000);
}
});
$(".to_top").click(function() {
if ($('html').scrollTop()) {
$('html').animate({
scrollTop: 0
}, 300);
return false;
}
$('body').animate({
scrollTop: 0
}, 300);
return false;
});
});
</script>
</body>
</html>