前端模块系统的发展史 -- Webpack

本贴最后更新于 2478 天前,其中的信息可能已经渤澥桑田

Webpack 是什么

我们在使用 React、Angular、Vue 或者自定义的前端框架时,基本上都会使用到 Webpack,因为不管你的模块形式是 CommonJS、AMD 还是一般的 JS 文件,或者你需要动态表达式 require("./"+name+".jade") Webpack 基本上都可以帮你解决。加上他的 Loader 转换器可以将其它各种非 JavaScript 模块资源都转换成 JavaScript,并帮你处理。它不光有自己的 API 方便使用,还有一套完整的插件体系,开发者可以通过插件进行快速的开发,并且大部分插件都是开源的。

通过配置文件来了解 Webpack

虽然从 webpack v4.0.0 开始,可以不用引入一个配置文件,但是要真正了解 webpack 还是需要从它的配置文件说起。

这里给一个例子,有些注释写的不对的地方请大家指出:

const path = require('path'); module.exports = { mode: "production", // 这个是最优化的编译结果 mode: "development", // 开发模式,可以使用很多的工具来增强开发 mode: "none", // 什么也不做,注意它不是默认值 //入口文件的位置 entry: "./app/entry", entry: ["./app/entry1", "./app/entry2"], entry: { a: "./app/entry-a", b: ["./app/entry-b1", "./app/entry-b2"] }, //输出路径 output: { path: path.resolve(__dirname, "dist"), // string filename: "bundle.js", //单页的输出 filename: "[name].js", // 多页的输出 filename: "[chunkhash].js", //文件缓存(长期的),原来的文件名上带一串hash字符串,自己测试只适用于js和css publicPath: "/assets/", //资源路径 publicPath: "", publicPath: "https://cdn.example.com/", library: "MyLibrary", //这里可以参见前面一篇文章 libraryTarget: "umd", libraryTarget: "umd2", libraryTarget: "commonjs2", libraryTarget: "commonjs", libraryTarget: "amd", libraryTarget: "this", libraryTarget: "var", libraryTarget: "assign", libraryTarget: "window", libraryTarget: "global", libraryTarget: "jsonp", chunkFilename: "[id].js", chunkFilename: "[chunkhash].js", jsonpFunction: "myWebpackJsonp", //源文件的映射,方便调试 sourceMapFilename: "[file].map", sourceMapFilename: "sourcemaps/[file].map", devtoolModuleFilenameTemplate: "webpack:///[resource-path]", devtoolFallbackModuleFilenameTemplate: "webpack:///[resource-path]?[hash]", //如果output.libraryTarget设置为umd, `output.library设置了,这个选项设为true将会给命名给amd模块` umdNamedDefine: true, // boolean // use a named AMD module in UMD library //选项用于跨域加载chunks crossOriginLoading: "use-credentials", //这里是一个枚举选项,允许跨域加载,会在请求中发送证书 crossOriginLoading: "anonymous", //匿名,不发送证书 crossOriginLoading: false, //设为false禁止跨域加载 //模块的配置项 module: { rules: [ // 这里使用我换成常用的一些loader { test: /\.js$/, enforce: 'pre', loader: 'eslint-loader', options: { emitWarning: true, fix: true }, }, //使用scss-loader | css-loader和style-loader { test: /\.(css)$/, // exclude: /node_modules/, use: plugin.extract({ use: [{ loader: 'css-loader', options: { module: true, imporLoader: 1, sourceMap: true, }, }, ], fallback: 'style-loader', }), }, //对图片和字体进行打包 { test: /\.(gif|png|jpg|woff|svg|eot|ttf)\??.*$/, loader: 'url-loader?limit=100&name=resource/[name].[ext]' }, ], }, //这个模块解决模块的请求,他不适用于loader resolve: { modules: [ "node_modules", path.resolve(__dirname, "app") ], extensions: [".js", ".json", ".jsx", ".css"], //这里用来设置别名 alias: { "module": "new-module", "only-module$": "new-module", "module": path.resolve(__dirname, "app/third/module.js"), t }, alias: [ { name: "module", // the old request alias: "new-module", // the new request onlyModule: true // if true only "module" is aliased // if false "module/inner/path" is also aliased } ], symlinks: true, // follow symlinks to new location descriptionFiles: ["package.json"], // files that are read for package description mainFields: ["main"], // properties that are read from description file // when a folder is requested aliasFields: ["browser"], // properites that are read from description file // to alias requests in this package enforceExtension: false, // if true request must not include an extensions // if false request may already include an extension moduleExtensions: ["-module"], enforceModuleExtension: false, // like extensions/enforceExtension but for module names instead of files unsafeCache: true, unsafeCache: {}, cachePredicate: (path, request) => true, //插件的使用,比如压缩,处理网页模板等插件的使用,大家可以去更多的到网上去查查,这里就不再赘述 plugins: [ // ... ] } };

这里基本上算是将前端模块系统的发展史给介绍完了,如果有写的不是很清楚或者不正确的地方,希望大家能够提出。

接下来,我将写一系列的 Angular4+ 的文章,大家可以继续关注。

最后,我再给大家一个 CSS 的蜡烛动画的代码,这里不给出效果,大家自己动手去试一下,算是对之前 css 动画系列的一个补充:

<div class="candle"> <span class="glow"></span> <span class="flames"></span> <span class="thread"></span> </div> <style> body{ background: #000510; font-family: 'Titillium Web', sans-serif; width: 100%; width: 150em; height: 40em; } .candle { width: 15em; height: 30em; font-size: 7px; background: linear-gradient( orange, darkorange, sienna, saddlebrown 50%, rgba(0, 0, 0, 0.6) ); box-shadow: inset 2em -3em 5em rgba(0, 0, 0, 0.4), inset -2em 0 5em rgba(0, 0, 0, 0.4); border-radius: 10em / 4em; position: relative; display: flex; justify-content: center; top: 10em; } .candle::before { content: ''; position: absolute; width: inherit; height: 5em; border: 0.2em solid darkorange; border-radius: 50%; box-sizing: border-box; background: radial-gradient( #444, orange, saddlebrown, sienna, darkorange ); filter: opacity(0.7); } .thread { position: absolute; width: 0.6em; height: 3.6em; top: -1.8em; background: linear-gradient( #111, black, orange 90% ); border-radius: 40% 40% 0 0; } .flames { position: absolute; width: 2.4em; } .flames::before { content: ''; position: absolute; width: inherit; height: 6em; background-color: royalblue; top: -4.8em; border-radius: 50% 50% 35% 35%; border: 0.2em solid dodgerblue; box-sizing: border-box; filter: opacity(0.7); } .flames::after { content: ''; position: absolute; width: inherit; height: 12em; top: -12em; background: linear-gradient(white 80%, transparent); border-radius: 50% 50% 20% 20%; box-shadow: 0 -0.6em 0.4em darkorange; animation: enlarge 5s linear infinite, move 6s linear infinite; } @keyframes move { 0%, 100% { transform: rotate(2deg); } 50% { transform: rotate(-2deg); } } @keyframes enlarge { 0%, 100% { height: 12em; top: -12em; } 50% { height: 14em; top: -13em; } } .glow { position: absolute; width: 10em; height: 18em; background-color: orangered; border-radius: 50%; top: -17em; filter: blur(6em); animation: blink 100ms infinite; } @keyframes blink { to { filter: blur(6em) opacity(0.8); } } </style>
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 249 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 549 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 447 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 666 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 5 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 655 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 757 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 385 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 249 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 1 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖 • 2 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 9 关注
  • Word
    13 引用 • 41 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 5 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    117 引用 • 54 回帖 • 3 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    95 引用 • 901 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 374 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 22 关注