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

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

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)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 291 关注
  • Node.js

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

    138 引用 • 268 回帖 • 147 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 531 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 233 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 732 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 4 关注
  • Mobi.css

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

    1 引用 • 6 回帖 • 708 关注
  • 旅游

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

    86 引用 • 896 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • BAE

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

    19 引用 • 75 回帖 • 618 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WebComponents

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

    1 引用 • 15 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 632 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 405 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    171 引用 • 813 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 524 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    484 引用 • 906 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 605 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 31 回帖 • 8 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    541 引用 • 3529 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 60 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 2 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 262 关注
  • frp

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

    16 引用 • 7 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 11 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 191 关注