返回顶部
首页 > 资讯 > 前端开发 > node.js >如何使用webpack构建一个库
  • 820
分享到

如何使用webpack构建一个库

2024-04-02 19:04:59 820人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“如何使用webpack构建一个库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用WEBpack构建一个库”这篇文章吧。输出产物构

这篇文章主要为大家展示了“如何使用webpack构建一个库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用WEBpack构建一个库”这篇文章吧。

输出产物

构建一个库与构建一个一般应用最大的不同点在于构建完成后输出的产物

一般应用构建完成后会输出:

  • 一个 html 文件

  • 一个 js 入口 chunk 、若干子 chunk

  • 若干 CSS 文件

  • 若干其它资源,如图片、字体文件等

虽然输出的资源非常多,但实际上所有的依赖、加载关系都已经从 html 文件开始一层一层定下来了,换句话说,这个 html 文件实际上就是整个应用的入口。

一个库构建完成后会输出:

  • 一个 CommonJS 格式的 js 文件

  • 一个未压缩的 UMD 格式的 js 文件

  • 一个已压缩的 UMD 格式的 js 文件

  • 可能包括若干的 css 文件

  • 可能包括若干的其它资源文件

库的入口分别是上面罗列的 js 文件;你可能会奇怪,一个库怎么会有3个入口文件呢?莫急,且听我一一道来。

CommonJS

CommonJSnode.js 推行的一种模块化规范,主要语法包括module.exportsrequire()等;而我们在使用 webpack 引入 npm 包时,实际上是处于 node.js 环境,由此可知,这个 CommonJS 格式的入口 js 文件(<库名称>.common.js)是供其它应用在 Node.js 环境下引入 npm 包使用的。由于在引用 npm 包时一般不会过多考虑 npm 包的体积(在构建自己的应用时如有需要可自行压缩),且为了方便调试,因此该 js 入口文件是没有经过压缩的。

UMD

UMD 是一个模块化规范大杂烩,除了兼容 CommonJS 外,它还兼容 AMD 模块化规范,以及最传统的全局变量模式。

这边稍微介绍一下 AMD 规范, AMD 全称 Asyncchronous Module Definition ,一般应用在浏览器端(这是与 CommonJS规范最大的不同点),最著名的 AMD 加载器是 RequireJS 。目前由于 webpack 的流行, AMD 这一模块化方案已逐渐退出市场。

全局变量模式就很好理解了,就是把库的入口挂载在一个全局变量(如window.xxx)上,页面上的任何位置都能随时取用,属于最传统的 js 插件加载方案。

由上可知, UMD 格式的入口 js 文件,既可以用于引用 npm 包的场景(未压缩的版本,即<库名称>.umd.js),也可以直接用于浏览器端(已压缩的版本,即<库名称>.umd.min.js)。

如何构建不同模块化规范的库文件

目前, webpack 不支持同时生成多份入口 js 文件,因此需要分多次来进行构建。

关键的 webpack 配置是:

  • CommonJS:output.libraryTarget: "commonjs2"

  • UMD:output.libraryTarget: "umd"

对于 UMD ,我们还需要设置全局变量名称,即output.library: "LibraryName"

为了压缩构建出来的文件,最简单的方法是在 CLI 中调用 webpack 命令时带上 mode 参数,如webpack --mode=production;这是因为当 mode 的值为production时, webpack 会自动启用 UglifyJsPlugin源码进行压缩。

输出版本信息

我在某公司工作时,该公司对第三方依赖抓得很紧,所有在项目里使用的第三方依赖都必须申请且审核通过后才可使用;且申请时是精确到具体版本的,未申请的软件版本也一概不允许使用。某些第三方依赖无论在文件内容上,还是在文件名称上,都没有体现出版本号,这就对我们识别这类第三方依赖产生障碍,这是我们开发自己的库时需要引以为戒的。

在构建库时,我们完全可以利用 webpack 把库的信息直接输出到文件内容里,有了这“身份信息”,用户使用起来也会格外安心。

输出库版本信息的方法是使用 webpack.BannerPlugin ,最简单的使用方法如下:

const pgk = require('./package.JSON');
const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;


{
    // ...其它配置
    plugins: [
        // ...其它 plugin 配置
        new webpack.BannerPlugin(banner);
    ]
}

最终生成出来的效果是:

source map

如果库的用户是直接通过在浏览器里加载你的库来使用的话,那么提供一份 source map 文件是非常有必要的;这是因为你的库在经过 webpack 构建,甚至压缩后,与源代码已经大相径庭了,用户将难以在浏览器中进行调试;但如果你能为自己的库附上一份 source map ,浏览器开发者工具会调用 source map 来帮助解析,用户的调试体验会更接近于调试库的源码。

相应的 webpack 配置为:

// webpack 配置
{
    // ...其它配置
    devtool: 'cheap-module-source-map'
}

webpack 支持多种类型的 source map ,不同类型的 source map 在生成速度、支持功能(如 babel )、调试位置偏移等问题上均有不同表现,我这边只做推荐:

  • 开发环境:cheap-module-eval-source-map

  • 生产环境:cheap-module-source-map

关于其它类型的 source map ,请查看 webpack 官方文档的 devtool 章节。

排除第三方依赖

与一般应用不一样,在开发库的时候,我们应尽量避免引入第三方库(构建过程中使用的工具链除外),因为这些第三方库会让我们写的库的大小猛增;很可能会出现这样的情况:我们自己写的小功能只有几百行代码的逻辑,构建出来的库却有几百k,那这样的库意义就不大了。

但我们的确也很难避免使用第三方库,那该咋办呢?

// webpack 配置
{
    // ...其它配置
    externals: {
        lodash: {
            commonjs: 'lodash',
            commonjs2: 'lodash',
            amd: 'lodash',
            root: '_'
        }
    }
}

使用上述配置后,我们构建出来的库中就不会包含配置中指定的第三方库(例子中为lodash)了,下面来一一详解:

  • commonjscommonjs2项都是指明用户在 node.js 环境下使用当前库时,以 CommonJS 的方式来加载名为lodash的 npm 包。

  • amd项表示在浏览器中加载运行本库时,本库会试图以 AMD 的方式来加载名为lodash的 AMD 模块。

  • root项表示在浏览器中加载运行本库时,本库会试图取全局变量window._(通过<script>标签加载lodash.js时, lodash 会把自己注入到全局变量window._中)。

与一般应用不一样的 externals 配置

在一般应用中,你或许会看到这样的 externals 配置:

// webpack 配置
{
    // ...其它配置
    externals: {
        lodash: '_'
    }
}

这样的 externals 配置方式意味着:无论在什么环境,都要取_这个全局变量;如果当前是在一般应用且确定已经使用<script>来加载指定的第三方库(比如 JqueryVue 等核心库,的确很常以这种方式来加载),当然大可直接这样用;但我们作为库的作者,应提供更宽松更灵活的使用方式。

完整的 webpack 配置示例

由于构建不同模块化规范的库需要不同的 webpack 配置(其实也只是稍有不同)来进行多次构建,因此本文只针对构建 UMD 格式且已压缩这一场景来展示最简单的 webpack 配置示例;如果想知道如何更有效率地拼接 webpack 配置,请看 micro-schema-validator 项目的 webpack 配置文件:

// webpack.config.js
const webpack = require('webpack');
const pkg = require('./package.json'); // 把 package.json 作为信息源
const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;

module.exports = {
  entry: `${__dirname}/index.js`,
  devtool: 'cheap-module-source-map',
  output: {
    path: `${__dirname}/dist`, // 定义输出的目录
    filename: 'micro-schema-validator.min.js', // 定义输出文件名
    library: 'MicroSchemaValidator', // 定义暴露到浏览器环境的全局变量名称
    libraryTarget: 'umd', // 指定遵循的模块化规范
  },
  
  externals: {
    lodash: {
      commonjs: 'lodash',
      commonjs2: 'lodash',
      amd: 'lodash',
      root: '_'
    }
  },
  module: {
    rules: [
      {
        test: /(\.jsx|\.js)$/,
        loader: 'babel-loader',
        exclude: /(node_modules|bower_components)/
      },
      {
        test: /(\.jsx|\.js)$/,
        loader: 'eslint-loader',
        exclude: /(node_modules|bower_components)/
      }
    ]
  },
  plugins: [
    new webpack.BannerPlugin(banner) // 输出项目信息
  ]
};

利用 vue-cli 定制并管理 webpack 配置

对于 Vue 生态的库,如 Vue 组件、Vue 自定义指令等,可以使用 vue-cli (本文特指 vue-cli 3.0 后的版本)根据你的需求来定制 webpack 配置,可定制内容包括:

  • 是否启用 Babel

  • 是否接入 typescript 语法

  • 是否支持 PWA

  • 是否使用 Vue-Router 和 Vuex

  • 是否使用 CSS 预处理器,并可选择具体的 CSS 预处理器,包括 Sass / Less / Stylus

  • 是否使用 ESLint 和 Prettier

  • 是否接入单元测试和端对端测试(E2E)

定制完成后, vue-cli 将生成一个种子项目,该项目可执行(包括本地开发和构建生产环境的包)但没有实际内容(实际内容不还得由你来写嘛哈哈)。与一般的脚手架工具相比, vue-cli 除了可以生成 webpack 配置外,还将持续对其进行管理和维护,如:

  • 提供一个统一的自定义配置的入口;过往,我们为了达到自定义配置的目的,往往会直接在脚手架工具生成出来的 webpack 配置上直接进行修改,这样会导致修改点非常分散,难以让自定义的 webpack 配置在其它项目复用;而使用 vue-cli 后,所有对 webpack 配置的修改点都被集中管理起来了,需要复用的话,直接把这自定义配置文件(vue.config.js)迁移到别的项目即可。

  • 提供持续更新 webpack 配置的机制;假如现在有一个开源库,我为了达到自己的目的,肆意在库源码上修改,那么当我需要升级该开源库的时候可就犯难了,因为这会把我之前做的修改都覆盖掉;同理可得,vue-cli 由于统一了自定义配置的入口,并且是在每次运行项目(运行项目也是通过执行 vue-cli 的命令而非 webpack)时动态渲染 webpack 配置的,因此项目的 webpack 配置可以随着 vue-cli 的升级而不断升级了。

  • 提供持续更新 webpack 工具链的机制;众所周知, webpack 工具链中包含了大量的第三方开源库,如 Babel 、ESLint 等,这些开源库也都是在不断更新当中,在这个过程中,必然会不断产生 Breaking Change ,所幸 vue-cli 通过自身升级——不断修改 webpack 配置来达到适配最新版第三方开源库的目的,而我们的项目也可以以极小的代价(升级 vue-cli 本身)来获取 webpack 工具链的不断更新。

vue-cli 自定义配置示例

摘自 vue-directive-window 项目的  vue.config.js 文件:

const webpack = require('webpack');
const pkg = require('./package.json');

const banner = `
${pkg.name}
${pkg.description}\n
@version v${pkg.version}
@homepage ${pkg.homepage}
@repository ${pkg.repository.url}\n
(c) 2019 Array-Huang
Released under the MIT License.
hash: [hash]
`;

module.exports = {
  chainWebpack: config => {
    config.output.libraryExport('default');
    config.plugin('banner').use(webpack.BannerPlugin, [
      {
        banner,
        entryOnly: true,
      },
    ]);
  },
};

看起来是不是比上文中最基础的 webpack 配置还要简洁呢?当项目的架构逐渐丰富起来后,这个差距将不断拉大。

以上是“如何使用webpack构建一个库”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: 如何使用webpack构建一个库

本文链接: https://lsjlt.com/news/83489.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用webpack构建一个库
    这篇文章主要为大家展示了“如何使用webpack构建一个库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用webpack构建一个库”这篇文章吧。输出产物构...
    99+
    2024-04-02
  • 使用typescript+webpack构建一个js库的示例详解
    目录入口文件tsconfig配置webpack配置文件webpack入口文件配置webpack为typescript和less文件配置各自的loaderwebpack的output配...
    99+
    2024-04-02
  • 如何使用SQL构建一个关系数据库
    本篇文章给大家分享的是有关如何使用SQL构建一个关系数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用 SQL 构建一个关系数据库比你想...
    99+
    2024-04-02
  • 如何使用webpack构建多页面应用
    这篇文章给大家分享的是有关如何使用webpack构建多页面应用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。需求来看下我们的需求:使用webpack-dev-server做开发时...
    99+
    2024-04-02
  • 如何使用Webpack构建多页面程序
    这篇文章给大家分享的是有关如何使用Webpack构建多页面程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。原理将每个页面所在的文件夹都看作是一个单独的单页面程序目录,配置多个entry以及html-webpac...
    99+
    2023-06-14
  • 使用Dockerfile如何构建一个docker镜像
    这篇文章给大家介绍使用Dockerfile如何构建一个docker镜像,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Dockerfile构建docker镜像1、什么是Dockerfile?   ...
    99+
    2023-06-14
  • 如何使用Django构建一个PHP容器?
    Django是一个流行的Python Web框架,它被广泛用于构建高性能、易于维护的Web应用程序。而PHP是一种常见的编程语言,被广泛用于Web开发。在本文中,我们将介绍如何使用Django构建一个PHP容器。 1.准备工作 在开始之前,...
    99+
    2023-08-06
    容器 django 索引
  • 如何优化组件库的webpack构建速度
    这篇文章给大家分享的是有关如何优化组件库的webpack构建速度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景在公司的主要工作是组件库(基于vue的ui组件库,类似eleme...
    99+
    2024-04-02
  • webpack如何构建react多页面应用
    这篇文章给大家分享的是有关webpack如何构建react多页面应用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。利用creat-react-app 新建一个react应用npm...
    99+
    2024-04-02
  • vue-cli中怎么利用webpack 构建一个多页面应用
    vue-cli中怎么利用webpack 构建一个多页面应用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。关于vue.jsvue.js是一套...
    99+
    2024-04-02
  • 如何构建webpack+es6+angular1.x项目
    这篇文章给大家分享的是有关如何构建webpack+es6+angular1.x项目的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。技术栈概述ES2015(ES6)大名ES2015,...
    99+
    2024-04-02
  • 如何提高Webpack的构建速度
    这篇文章主要为大家展示了“如何提高Webpack的构建速度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何提高Webpack的构建速度”这篇文章吧。一、背景随着我们的项目涉及到页面越来越多,功...
    99+
    2023-06-15
  • 如何用GIN构建一个WEB服务
    这篇文章主要介绍“如何用GIN构建一个WEB服务”,在日常操作中,相信很多人在如何用GIN构建一个WEB服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用GIN构建一个WEB服务”的疑惑有所帮助!接下来...
    99+
    2023-06-26
  • 如何使用Node.js构建一个简单Web服务器
    Node.js是一个用于后端服务的JavaScript运行环境,它允许开发者使用同一种语言编写服务器端和客户端应用程序。与其他后端技术相比,Node.js具有更高的处理能力和更好的可扩展性。在这篇文章中,我们将介绍如何使用Node.js构建...
    99+
    2023-05-14
  • JavaScript Webpack 入门教程:一步一步构建你的第一个项目
    1. 什么是 Webpack? Webpack 是一个打包工具,可以将多个 JavaScript 文件捆绑成一个文件,从而提高加载速度和减少请求数量。它还支持各种插件,可以帮助您实现各种功能,如代码压缩、代码分块和代码热更新等。 2. ...
    99+
    2024-02-24
    JavaScript Webpack 项目构建 开发工具 代码打包
  • JavaScript Webpack:实战案例,教你如何利用Webpack构建真实项目
    Webpack是一个模块打包工具,它可以将多个模块打包成一个文件,从而减少HTTP请求的数量,提高页面的加载速度。Webpack还提供了许多功能,例如代码压缩、代码分割、代码热更新等,可以帮助提高开发效率。 一、Webpack基础知识 ...
    99+
    2024-02-08
    JavaScript Webpack 项目构建 Vue
  • 如何构建一个JSON字符串
    本篇文章给大家分享的是有关如何构建一个JSON字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、alibaba 的 FastjsonFastjson 是一个以 Java ...
    99+
    2023-05-31
    json 字符串
  • vue中怎么使用webpack构建多页面
    vue中怎么使用webpack构建多页面,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、开发环境node v6.11.0二、...
    99+
    2024-04-02
  • webpack如何使用
    本篇内容介绍了“webpack如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!webpack介绍和使用一、webpack介绍1、由来由...
    99+
    2023-07-02
  • 如何快速开发一个Webpack Loader
    本篇内容主要讲解“如何快速开发一个Webpack Loader”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速开发一个Webpack Loader”吧!L...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作