Java 中的模块

传统的前端开发就是 JS、HTML、CSS 三件套。Web 没有像 Java 一样拥有优秀的模块机制,就是类与类之间可以分装在不同的包下,不同包下的类互相引用时通过import导入即可。模块之间的类名不会发生冲突。你可以把模块想象是一个平行世界,平行世界之间如果要互通就打开一道时空之门(import)来进行链接。

下面是两个不同包里的相同类名的类:

package demo.a;

class DemoA {}
package demo.b;

class DemoA {}

在 package demo.test 中,我们创建一个 Test 类。入口函数中创建了两个相同类名(ClassA)的对象。第一个 ClassA 是通过 import 语句导入了 demo.a.ClassA;第二个 ClassA 则是在类名前加上包名地址的 ClassA。模块让我们类名、变量都不冲突:

package demo.test;

import demo.a.ClassA;

public class Test {

	public static void main(String[] args) {
ClassA a = new ClassA();
demo.b.ClassA b = new demo.b.ClassA();
} }

Web 中的模块

没有模块的问题

回到标题一当中最开头说的,Web 有 JavaScript、HTML、CSS,这些文件不存在模块,互相导入的机制。虽然 HTML 可以通过标签引入这些文件,但是不存在独立空间的东西。把 js 代码拆分一个个 .js 文件,再通过 <script> 标签依次引入,这样会导致“变量污染”等问题,变量冲突问题也非常频繁。

下面分别是不同文件夹之下的同名文件,其实不同民文件,只要是相同的变量名就会引发变量污染:

demo/a/ClassA.js:

let a = 10;

demo/b/ClassA.js:

let a = 100;
<script src="../a/ClassA.js"></script>
<script src="../b/ClassA.js"></script>

控制台直接报错误:Uncaught SyntaxError: Identifier 'a' has already been declared (at ClassA.js:1:1)。说的是,变量名 a 已经被声明了。

Node.js 模块

现如今,基于 Node.js,Web 有了模块机制,也可以像 Java 那样使用模块,每一个文件都是一个独立的空间,相同的变量名只要不是在一个模块中就不会发生“变量污染”的问题。

模块引用复杂

Web 的资源非常复杂,有 JavaScript 文件、CSS 文件、HTML 文件,以及其他媒体文件。这些文件互相存在引用关系,如下图:

Webpack 就是集成一个个模块的打包工具,它基本上要完成的内容包括:

  1. 代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等。
  2. 文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。
  3. 代码分割:提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。
  4. 模块合并:在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件。
  5. 自动刷新:监听本地源代码的变化,自动重新构建、刷新浏览器。
  6. 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
  7. 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。

作用是什么

Webpack 会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。模块是分散,打包是集中。

假如你的项目中有一百个 .js 文件,Webpack 就把这些文件都打包成一个 .js 文件。

构建工具有 Webpack、Grunt、Gulp、Fis3、Rollup,以及 Vue 推出的 Vite 下一代构建工具。

最后

废话不多说,直接上手体验 Webpack 的魅力吧:搭建 Webpack 项目步骤

简单理解 Webpack,以及Web前端使用打包工具的原因的更多相关文章

  1. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  2. 转 WEB前端性能分析--工具篇

    在线网站类: WebPageTest 说明: 在线的站点性能评测网站,地址http://www.webpagetest.org/ 补充: 其实这网站也是个开源项目,所以支持自己搭建一个内部的测试站点 ...

  3. Web前端开发必备工具推荐

    http://gaohaixian.blog.163.com/blog/static/12326010520114265223489/不管你做前端开发还是网页重构,前端工具都起着非常重要的作用,这里向 ...

  4. Brackets 1.8 开源+免费的Web前端网页文本编辑工具

    Brackets 1.8 开源+免费的Web网页文本编辑工具   -------------->> ---------------------- A modern, open source ...

  5. 各式 Web 前端開發工具整理

    程式碼編寫工具 (Coding Tools) 工作流程/建置/組合 (Workflow/Builds/Assemblers) lumbar brunch grunt lineman yeoman Ta ...

  6. 关于WEB前端开发的工具

    俗话说:"工谷善其事,先必利其器."一个用得顺手的工具,确实能为我们的开发带来方 便,更重要的是会让我们更加享受工具开发过程中所带来的乐趣. 1.编码工具: 记事本之类的编辑器都可 ...

  7. react纯前端不依赖于打包工具的代码

    ####react最基础的语法和不依赖环境的纯前端免编译代码 参照:http://www.ruanyifeng.com/blog/2015/03/react.html 注意事项:1.必须放倒服务器上, ...

  8. 前端项目打包工具weexpack的安装

    最下面是本人安装时候的系统环境,本篇文章只限于参考,不一定非得是这样,原因你懂得. 打包的过程中出现的问题 1.执行到weexpack run android的时候,到了resolving class ...

  9. web前端开发常用工具

    http://www.gbin1.com/technology/javautilities/20120806-resource-for-front-end-developer/ 冒泡样式 http:/ ...

随机推荐

  1. split(),strip,split("/")[-1] 和 split("/",-1)的区别

    Python中split()函数,通常用于将字符串切片并转换为列表. 一.函数说明: split():语法: str.split(str="",num=string.count(s ...

  2. ThreadLocal模板

    public class UserIdThreadLocal { private static final ThreadLocal<Long>LOCAL=new ThreadLocal&l ...

  3. Maven POM文件介绍

    1. POM文件是什么 1.1 Super POM 1.2 Minimal POM 1.3 Effective POM 3. 项目继承 和 项目聚合 2.1 Project Inheritance 项 ...

  4. Linux服务器启动jstatd服务

    Linux服务器启动jstatd服务 1.查找jdk所在目录 2.在jdk的bin目录下创建文件jstatd.all.policy touch jstatd.all.policy 3.写入安全配置 g ...

  5. 6大优势、2种类型,一文吃透动态应用安全测试(DAST)

    在在上篇文章中中,我们了解了 SAST 的概念.优劣和使用的工具,并在文章里提到了另一个软件安全领域里的重要技术 DAST.本文将会详细介绍 DAST 的概念.重要性及其工作原理.   DAST(Dy ...

  6. 使用dockerfile部署springboot应用

    本章简单展示如何最短时间 把springboot应用打包成镜像并创建成容器. 准备工作: 1.安装docker ,保证执行docker version没有问题 2.拉下来一个jdk镜像 docker ...

  7. RPA视频教程

    匠厂出品,必属精品   Uipath中文社区qq交流群:465630324 uipath中文交流社区:https://uipathbbs.comRPA之家qq群:465620839 第一课--UiPa ...

  8. UiPath存在文本Text Exists的介绍和使用

    一.Text Exists的介绍 检查是否在给定的UI元素中找到了文本,输出的是一个布尔值 二.Text Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为序 ...

  9. MOEAD实现、基于分解的多目标进化、 切比雪夫方法-(python完整代码)

    确定某点附近的点 答:每个解对应的是一组权重,即子问题,红点附近的四个点,也就是它的邻居怎么确定呢?由权重来确定,算法初始化阶段就确定了每个权重对应的邻居,也就是每个子问题的邻居子问题.权重的邻居通过 ...

  10. Qt项目开发实例 (含源码)

    源码传送门: 啊渊 / QT博客案例 · GitCode 目前QT的研发都是基于windows操作系统的,本文分享在国产操作系统中学QT的路线图,其实学习路线差不多,为了全面的回顾自己的学习知识,打算 ...