《Webpack5 核心原理与应用实践》学习笔记-> 构建npm包

简介: 《Webpack5 核心原理与应用实践》学习笔记-> 构建npm包


npm大家都应该很熟悉,包括之前也一直讲npm i [包名],这一次就来构建一个属于自己的npm

开发一个npm


准备工作当然是得新建一个工程,这个工程作为你的npm包的起点,我这里就叫first-npm-lib,老规矩,cd进入该目录下,然后npm init -y生成package.json文件。


这一节是使用webpakc构建npm包,所以还是需要先安装webpack的,npm i -D webpack webpack-cli


先不着急配置webpacknpm包当然是需要有具体功能的,所以我们先写自己的功能代码,开始正式环节。


  • 新建src目录。
  • src下新建index.js文件,就随便写一个数组乱序吧。


export function disorderedList(list = []) {
    const result = [].slice.call(list);
    return result.sort(_ => {
        return Math.random() - Math.random();
    })
}

完了之后就是专心webpack的配置了

  • 新建webpack.config.js,里面还是老一套的东西,入口出口啥的,不过需要注意的是出口不能像之前那样随意了。


const path = require("path");
module.exports = {
    mode: "development",
    entry: "./src/index.js",
    output: {
        filename: "[name].js",
        path: path.join(__dirname, "./dist"),
        library: {
            name: "firstNpmLib",
            type: "umd",
        },
    }
};

可以看到上面的出口配置多了一个library的配置,先不管这个配置是干嘛的,先直接npx webpack构建一下看看产出是什么。

image.png

可以看到打包出来的东西会有一个webpackUniversalModuleDefinition的立即执行函数,这就是library.type的作用了,下面是官方文档中的原话,文档在这:library


output.library.type配置将库暴露的方式。

  • 类型:string
    类型默认包括 'var''module''assign''assign-properties''this''window''self''global''commonjs''commonjs2''commonjs-module''commonjs-static''amd''amd-require''umd''umd2''jsonp' 以及 'system',除此之外也可以通过插件添加。


这里就着重讲一下umd


umd就是一种规范,是一个时代的产物,因为在es6没出来之前,js对于模块化的功能是非常弱的,于是就诞生出来了AMDCommonJS这两大派系的模块化方案,一分派系就难为程序员了,开始想兼容方案,一个包要两个规范都兼容才能有更多的使用量嘛,于是就诞生了umd,可以说是非常的“有趣”,所以这里使用的就是umd


使用了这种方案就可以这样使用自己开发的包了:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script src="./dist/main.js"></script>
<script>
    // Webpack 会将模块直接挂载到全局对象上
    const list = firstNpmLib.disorderedList([1, 2, 3, 4, 5, 6, 7]);
    console.log(list);
</script>
<script type="module">
// ES Module
import './dist/main.js';
const list1 = firstNpmLib.disorderedList([1, 2, 3, 4, 5, 6, 7]);
console.log(list1);
// CommonJS
// require('./dist/main.js');
// const list2 = firstNpmLib.disorderedList([1, 2, 3, 4, 5, 6, 7]);
// console.log(list2);
</script>
</html>

注意:上面的 ES Module 是直接引用的,不是import {xxx} form 'xxx',因为里面是立即执行函数,会暴露一个firstNpmLib作为全局变量来使用,这个firstNpmLib就是output.library.name属性控制的。

CommonJSrequire并不是浏览器原本就有的东西,这个一般存在于node环境中,所以这里我屏蔽了。


排除第三方依赖包


上面是我们自己开发的库,有时候难免会使用到第三方的依赖库,这个时候如果将第三方的依赖库打包到我们的包里面,无疑是会增加我们包的体积,如果用户也是使用了这个库,那么这个库在用户的代码中会存在双份,所以需要排除。


  • index.js代码修改如下


import {shuffle} from 'lodash';
export function disorderedList(list = []) {
    return shuffle(list)
}

现在记录一下打包前的文件体积,执行npx webpack看一下打包后的文件体积,也可以看看两者中的却别,都可以很明显的看到包的体积变大了很多。


这里就需要使用external属性来排除依赖库,修改webpack配置如下:


const path = require("path");
module.exports = {
    // 省略之前的配置
    externals: {
        lodash: {
            commonjs: 'lodash', // 移除 exports['xxx'] 这样写的方式
            commonjs2: 'lodash', // 移除 exports.xxx 这样写的方式
            amd: 'lodash', // 移除 amd 的使用方式
            root: '_', // 移除 全局变量挂载的方式
        },
    }
};

然后再执行npx webpack看看生成之后的产物吧,当然这样生成的东西不能独立运作哦,也就是上面讲过的使用方法或报错。


生成Sourcemap


Sourcemap就是对编译后的代码提供调试可定位到对应代码行的记录文件,例如vue开发环境下,报错了可以很轻易的定位到报错的代码行,而在生产环境下就不可以了,因为生产环境下没有Sourcemap


Sourcemap的使用很简单,webpack配置增加一个devtool就可以了。


module.exports = {
    // 省略之前的配置
    devtool: 'source-map'
};

devtool的可选值如下,下面来自官方文档:devtool,下面的翻译来自机翻。

这里简单解释一下:

构建就是初次打包速度,重建就二次打包(有缓存的情况下)的速度。

production指的是是否适合生产环境 quality指的是Sourcemap文件生成的地方。 comment应该都看得懂。


devtool performance production quality comment
(none) 构建:最快 重建:最快 是的 具有最高性能的生产构建的推荐选择。
eval 构建:快速 重建:最快 生成 具有最高性能的开发构建的推荐选择。
eval-cheap-source-map 构建:好的 重建:快 变身 开发构建的权衡选择。
eval-cheap-module-source-map 构建:慢 重建:快 原线 开发构建的权衡选择。
eval-source-map 构建:最慢的 重建:好的 原来的 使用高质量 SourceMap 进行开发构建的推荐选择。
cheap-source-map 构建:好的 重建:慢 变身
cheap-module-source-map 构建:慢 重建:慢 原线
source-map 构建:最慢 重建:最慢 是的 原来的 具有高质量 SourceMap 的生产构建的推荐选择。
inline-cheap-source-map 构建:好的 重建:慢 变身
inline-cheap-module-source-map 构建:慢 重建:慢 原线
inline-source-map 构建:最慢 重建:最慢 原来的 发布单个文件时的可能选择
eval-nosources-cheap-source-map 构建:好的 重建:快 变身 不包括源代码
eval-nosources-cheap-module-source-map 构建:慢 重建:快 原线 不包括源代码
eval-nosources-source-map 构建:最慢的 重建:好的 原来的 不包括源代码
inline-nosources-cheap-source-map 构建:好的 重建:慢 变身 不包括源代码
inline-nosources-cheap-module-source-map 构建:慢 重建:慢 原线 不包括源代码
inline-nosources-source-map 构建:最慢 重建:最慢 原来的 不包括源代码
nosources-cheap-source-map 构建:好的 重建:慢 变身 不包括源代码
nosources-cheap-module-source-map 构建:慢 重建:慢 原线 不包括源代码
nosources-source-map 构建:最慢 重建:最慢 是的 原来的 不包括源代码
hidden-nosources-cheap-source-map 构建:好的 重建:慢 变身 无参考,不包括源代码
hidden-nosources-cheap-module-source-map 构建:慢 重建:慢 原线 无参考,不包括源代码
hidden-nosources-source-map 构建:最慢 重建:最慢 是的 原来的 无参考,不包括源代码
hidden-cheap-source-map 构建:好的 重建:慢 变身 没有参考
hidden-cheap-module-source-map 构建:慢 重建:慢 原线 没有参考
hidden-source-map 构建:最慢 重建:最慢 是的 原来的 没有参考。仅将 SourceMap 用于错误报告目的时的可能选择


完成之后在执行npx webpack看看生成的内容,可以看到多了一个main.js.map文件,这个就是Sourcemap文件。


其他


上面的这些就已经把webpack的配置基本上都搞定了,除非你还需要有其他的需求,例如加上.css,例如使用.ts就需要配置一些额外的loader了,其他的就是一些小技巧。


  • .npmignore可以忽略某些文件不提交到npm
  • package.json中可以指定包的入口文件main属性可以指定包的入口。
  • package.json中指定module属性可以指定es module的入口,可以和上面的main并存。
  • package.json中指定repository属性可以指定仓库地址。
  • package.json中指定home属性可以指定主页地址。


就这么多吧,瑞思拜。


总结


npm包好像就是要让各种平台和规范都能使用,并没有什么特殊的,加之webpack已经给我们提供好了一系列的配置手段,让我们使用起来毫不费力,就是学习起来东西就有点多了,加油卷。


目录
相关文章
|
2月前
|
JavaScript 前端开发 Java
npm学习一:npm 包管理工具 学习、使用。
这篇文章介绍了npm的基础知识和常用命令,包括安装包、查看包信息、管理依赖等操作,并提供了如何删除npm安装的镜像以及如何彻底删除node_modules文件夹的具体步骤。
106 2
|
4月前
|
缓存 前端开发 数据可视化
Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一款可视化工具,帮助分析Webpack构建结果,找出占用空间较大的模块以便优化。首先需安装Webpack和Webpack Bundle Analyzer,接着在`webpack.config.js`中配置插件。运行Webpack后,会在`dist`目录生成`report.html`,展示交互式图表分析包大小分布。为优化可采用代码分割、Tree Shaking、压缩插件、加载器优化、模块懒加载、代码预热、提取公共库、使用CDN、图片优化、利用缓存、避免重复模块、使用Source Maps、优化字体和图标、避免全局样式污染以及优化HTML输出等策略。
162 3
|
2月前
|
JavaScript 前端开发 Java
npm学习一:npm 包管理工具 学习、使用。
这篇文章是关于npm包管理工具的学习、使用指南,包括npm概述、基础命令和如何安装webpack。
73 3
npm学习一:npm 包管理工具 学习、使用。
|
1月前
|
缓存 监控
webpack 提高构建速度的方式
【10月更文挑战第23天】需要根据项目的具体情况和需求,综合运用这些方法,不断进行优化和改进,以达到最佳的构建速度和效果。同时,随着项目的发展和变化,还需要持续关注和调整构建速度的相关措施,以适应不断变化的需求。
|
1月前
|
存储 缓存 前端开发
利用 Webpack 5 的持久化缓存来提高构建效率
【10月更文挑战第23天】利用 Webpack 5 的持久化缓存是提高构建效率的有效手段。通过合理的配置和管理,我们可以充分发挥缓存的优势,为项目的构建和开发带来更大的便利和效率提升。你可以根据项目的实际情况,结合以上步骤和方法,进一步优化和完善利用持久化缓存的策略,以达到最佳的构建效果。同时,不断探索和实践新的方法和技术,以适应不断变化的前端开发环境和需求。
|
2月前
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
387 0
|
2月前
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
130 0
|
3月前
|
JavaScript
使用npm,快速构建第一个vue项目
本文介绍了如何使用npm快速构建第一个Vue项目。步骤包括确保安装了Node.js并且配置了正确的环境变量,创建一个空文件夹并使用VSCode打开,通过VSCode的终端执行`npm init vue@latest`命令以初始化项目,选择默认配置即可。接着安装项目依赖并启动开发服务器,最后通过浏览器访问开发服务器提供的本地地址查看项目运行结果。文章还提供了相关代码和操作截图。
|
3月前
|
数据安全/隐私保护
发布一个npm包
发布一个npm包
123 2
|
4月前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
51 0

推荐镜像

更多
下一篇
DataWorks