node 第二十一天 webpack 初见

这篇具有很好参考价值的文章主要介绍了node 第二十一天 webpack 初见。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 为什么需要学习(了解)webpack
    webpack是前端工程化的基石,webpack又是基于node进行文件打包bundle,所以作为前端起手学习node服务端开发,同时学习webpack是很有必要的。
    随着vite的出现,vue这一脉可能也许不再需要学习webpack了,但是需要知道的是,打包一定是前端工程化绕不开的一个概念,如果是一个足够了解webpack的开发者,日后再学习任何一款前端构建工具都将事半功倍。
    但是webpack本身却是是复杂的。真要深入学习付出是必不可少的。
    经过基础学习之后能够具备对问题顺藤摸瓜的能力,这是基础要求。

  2. webpack概念

    本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。

  3. webpack核心配置项

    • webpack.common.js 基本配置项 入口(entry), 出口(output), 插件(plugins),模块打包(loader)
      const path = require('path');
      const HtmlWebpackPlugin = require('html-webpack-plugin');
      const webpack = require('webpack');
      const MyPlugin = require('./myPlugin');
      
      module.exports = {
        // 入口 可多个
        entry: './src/main.js',
        // 出口 可多个
        output: {
          path: path.resolve(__dirname, 'dist'),
          filename: 'build.js'
        },
        // 插件
        plugins: [
          new webpack.DefinePlugin({
            VERSION: JSON.stringify('1.0.0')
          }),
          new HtmlWebpackPlugin({ template: './public/index.html', title: 'webpack app' }),
          new MyPlugin()
        ],
        // 模块loader
        module: {
          rules: [
            {
              test: /\.css$/i,
              use: ['style-loader', 'css-loader', './myLoader']
            }
          ]
        }
      };
      
      
    • webpack.dev.js 开发环境配置项 代理服务器(devServer) 调试工具(devtool)
      const { merge } = require('webpack-merge');
      const path = require('path');
      const common = require('./webpack.common.js');
      const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
      
      module.exports = merge(common, {
        plugins: [
          new BundleAnalyzerPlugin({
            analyzerPort: 8888,
            openAnalyzer: false
          })
        ],
        // 模式
        mode: 'development',
        // devServer
        devServer: {
          static: {
            // 告诉服务器从哪里提供内容。只有在你希望提供静态文件时才需要这样做。static.publicPath 将会被用来决定应该从哪里提供 bundle,并具有优先级。
            publicPath: '/',
            directory: path.join(__dirname, 'public')
          },
          host: 'localhost',
          port: 8080,
          open: true
        },
        // source-map 会在webpack打包生成的文件模块的末端 加上 //# sourceURL=
        // 映射source-map
        devtool: 'inline-source-map'
      });
      
    • webpack.prod.js 生产环境配置项 externals(打包剔除优化)
      const { merge } = require('webpack-merge');
      const common = require('./webpack.common.js');
      const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
      const { CleanWebpackPlugin } = require('clean-webpack-plugin');
      
      module.exports = merge(common, {
        plugins: [
          new CleanWebpackPlugin(),
          new BundleAnalyzerPlugin({
            analyzerPort: 1055,
            openAnalyzer: false
          })
        ],
        // 模式
        mode: 'production',
        // externals key: value
        // key和 import jQ from 'jquery'; 中的 'jquery' 一样
        // value 用于替换 import jQ from 'jquery' 中的jQ
        // 所以 value 必须和cdn引用暴露的window变量一样
        externals: {
          jquery: 'jQuery'
        }
      });
      
  4. main.js 顺着main.js我们往下看

    import './style.css';
    
    import jQ from 'jquery';
    
    const str = 'hello webpack';
    // 再webpack中
    // 告知 webpack 将 process.env.NODE_ENV 设置为一个给定字符串。
    // 如果 optimization.nodeEnv 不是 false,则会使用 DefinePlugin,optimization.nodeEnv 默认值取决于 mode,
    // 如果为 falsy 值,则会回退到 "production"。
    console.log(process.env.NODE_ENV);
    //打包常量直接替换为 console.log('hello webpack');
    console.log(str);
    //生产环境用cdn
    console.log(jQ);
    //webpack.DefinePlugin
    console.log(VERSION);
    
    // 开启 devtool: 'inline-source-map' 方便调试
    // console.log(VERSION.t.t);
    
  5. 实现js文件中引入css
    因为在webpack.common.js中配置了css模块的loader,这样webpack就能知道怎么去处理对应的文件,以及处理之后给js暴露一个什么样的对象

  6. 生产环境不将jquery打包,改用cdn引入
    因为在webpack.prod.js中配置了打包剔除优化(externals),结合使用插件HtmlWebpackPlugin 结合 ejs语法, 在html模板中实现生产环境使用cdn引入jquery,当然此处还涉及了如何判断开发环境和生产环境,用到了一个node进程对象变量process.env.NODE_ENV 默认情况取决于webpack配置项mode的值
    html模板如下

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title><%= htmlWebpackPlugin.options.title %></title>
        <% if (process.env.NODE_ENV === 'production' ) { %>
        <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
        <% } %>
      </head>
      <body>
        <h1>hello webpack server</h1>
      </body>
    </html>
    
  7. 使用DefinePlugin 在 编译时 将代码中的变量替换为其他值或表达式
    这里你也可以用来区分开发环境和生产环境而不是使用process.env.NODE_ENV , 在main.js中我们输出了一个被定义为字符串1.0.0的VERSION,console.log(VERSION); ==> console.log('1.0.0');

  8. 实现MyLoader MyPlugincmd控制台打印MyLoader… MyPlugin… 自定义规则需要结合文档文章来源地址https://www.toymoban.com/news/detail-795618.html

    module.exports = function (source) {
      const content = source;
      console.log('MyLoader...');
      return content;
    };
    //loader 从右到左(或从下到上)地取值(evaluate)/执行(execute)
    //盲猜源码用了pop()
    
    module.exports = class MyPlugin {
      apply(compiler) {
        // 找到合适的事件钩子,实现自己的插件功能
        compiler.hooks.emit.tap('MyPlugin', () => {
          // compilation: 当前打包构建流程的上下文
          console.log('MyPlugin...');
        });
      }
    };
    

到了这里,关于node 第二十一天 webpack 初见的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第五十一天打卡

    中等 1.5K company 微软 Microsoft 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意

    2023年04月09日
    浏览(41)
  • 学习Android的第十一天

    目录 Android ProgressBar 进度条 ProgressBar ProgressBar 外观 ProgressBar 属性 ProgressBar 方法 Android ProgressBar 动图替代圆形进度条 范例 Android ProgressBar 自定义圆环进度条 例子: 参考文档 在Android中,ProgressBar(进度条)是用于显示任务进度的UI组件,通常用于耗时操作的过程中以及需要显

    2024年02月19日
    浏览(48)
  • C语言(第三十一天)

    6. 调试举例1 求1!+2!+3!+4!+...10!的和,请看下面的代码: 调试找一下问题。 7. 调试举例2 在VS2019、X86、Debug 的环境下,编译器不做任何优化的话,下面代码执行的结果是啥? 程序运行,死循环了,调试看看为什么? 调试可以上面程序的内存布局如下:  1. 栈区内存的使用习惯

    2024年02月11日
    浏览(44)
  • 学C的第三十一天【通讯录的实现】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客  ==============

    2024年02月15日
    浏览(54)
  • 从零开始的力扣刷题记录-第六十一天

    题目描述: 给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。 题解: 排序后从后往前遍历,取最大的三个边,如果满足两边之和大于第三边则返回,否则整体向前

    2024年02月09日
    浏览(57)
  • 谷粒商城第十一天-完善商品分组(主要添上关联属性)

    目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口,还有就是加上关联的那一套逻辑,包括基本构件的引入、数据域的

    2024年02月13日
    浏览(58)
  • 从零开始的力扣刷题记录-第五十一天

    题目描述: 给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 题解: 中序遍历存储节点后按顺序连接即可 代码(Go): 题目描述: 小扣在秋日市集发

    2024年02月08日
    浏览(44)
  • 15天学习MySQL计划-MySQL工具(进阶篇)-第十一天

    1.mysql 该mysql 不是指MySQL服务,而是指MySQL的客户端工具。 -e选项可以在MySQL客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。 2.mysqladmin mysqladmin是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态,创建并

    2024年02月01日
    浏览(61)
  • 【三十天精通Vue 3】第十一天 Vue 3 过渡和动画详解

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2023年04月17日
    浏览(42)
  • 【算法第十一天7.25】二叉树前、中、后递归、非递归遍历

    树的结构 ================================================ 链接 :力扣94-二叉树中序遍历 递归 思路 1、 确定返回值和方法参数 :需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值 2、 确定终止条件 :当前节点为空时,

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包