【学习】对工程化、wepack的理解

学习】对工程化、wepack的理解

前端的理解

浏览器会识别解析渲染html、css、js等生成页面,而一些比较新的html、css、js的api和vue、less、sass等浏览器是无法识别的,所以就需要用到webpack、gulp、grunt、vite、rollup、rolldown等工具解析转成浏览器能识别的语言渲染成页面。

webpack

webpack解析的几个流程

1.输入 --> 2.生成模块依赖并解析(代码分割、模块合并、TreeShaing、压缩等优化策略) --> 3.输出

输入
1.SPA应用通常只有一个输入文件
2.MPA应用有多个输入文件
 entry: {
      "entry.page1": "./app/pages/page1/entry.page1.js",
      "entry.page2": "./app/pages/page2/entry.page2.js",
    },
生成模块依赖并解析(代码分割、模块合并、TreeShaing、压缩等优化策略)

由于webpack只能识别js,收集模块依赖时,会有多种不同的文件后缀和路径查找,便于开发者开发,可以直接配置自动添加后缀名和配置别名进行依赖收集。

    extensions: [".js", ".vue", ".less", ".css"],
    alias: {
      $pages: path.resolve(process.cwd(), "./app/pages"),
      $common: path.resolve(process.cwd(), "./app/pages/common"),
      $widgets: path.resolve(process.cwd(), "./app/pages/widgets"),
      $store: path.resolve(process.cwd(), "./app/pages/store"),

解析时对于哪些非js的编码webpack无法识别,而webpack loader是可以将编码转成js,我们可以自己编写一个loader将指定文件转成js,也可以使用第三方库。

rules: [
      {
        test: /\.vue$/,
        use: {
          loader: "vue-loader",
        },
      },
      {
        test: /\.js$/,
        // 只对业务代码进行 babel, 加快 webpack 打包速度
        include: [path.resolve(process.cwd(), "./app/pages")],
        use: {
          loader: "babel-loader",
        },
      },
      {
        test: /\.(png | jpe?g| gif)(\?.+)?$/,
        use: {
          loader: "url-loader",
          options: {
            limit: 300,
            esModule: false,
          },
        },
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
      {
        test: /\.(eot | svg | ttf | woff| woff2)(\?\S*)?$/,
        use: "file-loader",
      },
    ],

 webpack plugin可以在解析webpack的某个生命周期中添加一些全局变量或是一些功能。

    // 处理 .vue 文件
    //  它是将你定义过的其他规则复制并应用到.vue 文件里
    // 例如: 如果有一天匹配规则 /\.js$/ 的规则,那么它会应用到 .vue 文件中的 <script>模块中
    new VueLoaderPlugin(),
    // 把第三库暴露到 window context下
    new webpack.ProvidePlugin({
      Vue: "vue",
      axios: "axios",
      _: "lodash",
    }),
    // 定义全局变量
    new webpack.DefinePlugin({
      __VUE_OPTIONS_API__: true, // 支出 vue 解析 optionApi
      __VUE_PROD_DEVTOOLS: false, // 禁用 vue 调试工具
      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false, // 禁用生产环境显示 "水合" 信息
    }),
    // 构建最终渲染的页面模版
    new HtmlWebpackPlugin({
      //产物(最终模版) 输出路径
      filename: path.resolve(
        process.cwd(),
        "./app/public/dist/",
        "entry.page1.tpl"
      ),
      // 指定要使用模版文件
      template: path.resolve(process.cwd(), "./app/view/entry.tpl"),
      // 要注入的代码块
      chunks: ["entry.page1"],
    }),

打包优化,对于稳定的第三包和业务的公共编码,常规编码,以及webpack运行时注入的编码进行分包,利用浏览器的缓存做优化

/**
     * 把js 文件打包成3种类型
     * 1.vendor:第三方 lib库 ,基本不会变动,除非依赖升级
     * 2.common:业务组件代码的公共部分抽取出来,改动比较少
     * 3.entry.{page}: 不同页面 entry 里的业务组件代码的差异部分,会经常改动
     * 目的:把改动和引用频率不一样的 js 区分出来,以达到更好的浏览器缓存的效果
     */
    splitChunks: {
      chunks: "all", // 对同步和异步模块都进行分割
      maxAsyncRequests: 10, //每次异步加载的最大并行请求数
      maxInitialRequests: 10, //入口点的最大并行请求数
      cacheGroups: {
        // 第三方依赖库
        vendor: {
          test: /[\\/]node_modules[\\/]/, //匹配打包 node_modules 文件
          name: "vendor", //模块名称
          priority: 20, //优先级,数字越大,优先级越高
          enforce: true, // 强制执行
          reuseExistingChunk: true, //复用已有的公共 chunk
        },
        //公共模块
        common: {
          name: "common", //模块名称
          minChunks: 2, // 被两处引用即被视为公共模块
          minSize: 1, //最小分割文件大小 (1byte)
          priority: 10, //优先级
          reuseExistingChunk: true, //复用已有的公共 chunk
        },
      },
    },
    // 将webpack 运行时生成的代码打包到 runtime.js
    runtimeChunk: true,
输出

解析压缩完成生成hash输出到指定的文件目录下

    filename: "js/[name]_[chunkhash:5].bundle.js",
    path: path.join(process.cwd(), "./app/public/dist/prod"),
    publicPath: "/dist/prod",
    crossOriginLoading: "anonymous",

总结

页面需要的html、css、js,使用vue写页面是便于前端模块开发维护,就需要一个工具将vue里的编码转成页面需要的语言。前端工具有很多webpack、gulp、grunt、vite、rollup、rolldown等。

更多前端面试资料:前端资料

世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球数据数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据免费下载服务,你可以根据自己的需求选择合适的网站进行下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值