webpack 打包依赖为window全局变量 ,直接h5 script 引入

6,791 阅读3分钟

开导:

有个原生 js 的项目, 因为要使用第三方插件,还只支持 npm 的方式引入(求此处心里阴影面积),不要问为什么只能npm 的方式安装插件,因为插件本身依赖也很多,所以不支持script,就算支持,也得引入很多东西,还容易引入不需要的依赖(慌!!!),下张图可能导致不适,请别看。

怎么解决?

首先请保证你的电脑有以下条件:  一台能用的电脑,node.js (npm) 环境,   代码编辑工具。

我使用的是 yarn ,和 npm 区别不是很大。 

1. 创建一个文件夹。 我的依赖很多。 但是js 文件就1个。 所以我就创建了一个文件夹, 如果js 多的话,也可以使用开发工具创建空项目。

2. 控制台执行 yarn init / npm init。 初始化 package.json。 不解释,你们都懂的。 

3. 控制台执行 webpack -v ,这里是检测你是否安装了全局 webpack ,安装了会得到版本号,未安装会提示不是可执行命令。 那么就需要安装了。

npm install -g webpack / yarn global add webpack
// 安装完成后,再执行一下 上面命令,得到版本号就可以进行下一步了,
// 这里安装完成,可能还需要重启命令行,未成功请尝试此操作。

4. 安装你需要的 依赖。【这里我已我的项目场景演示】

yarn add uuid protobufjs // 安装完成依赖,就可以进行你的插件js 编写了。

 

我只使用了这两个。

5. 新建一个index.js 文件,编写你的逻辑代码。下面是我的代码示例。 

有个坑:导出的插件js 必须 export default ,不然你使用 script 使用时,会得到 undefined。请注意。

6. 编写完成,就应该打包了, 创建一个webpack的配置文件,命名为【webpack.config.js】。

为了方便理解。 先贴一张项目目录的图。

var path = require("path"); // webpack 内部依赖。可不管。
module.exports = {
 entry: {
    index: path.join(__dirname, 'index.js'), // 这里是入口文件。 可多个引入
    // 多个文件引入示例
    // home: path.join(_dirname, 'home.js')
    // _dirname webpack 全局变量,代表当前项目目录。
    // 这里必须使用 webpack 的 path,指定当前目录 
    // ,不然就会默认读C 盘根目录。踩过坑,请注意。
  },
  output: {
    path: path.join(__dirname, '/dist'), // 输出目录,使用过vue的 应该很熟悉了。
    filename: 'ImClientService.js', // 输出文件 名称
    libraryExport: "default", // 添加这个的意思,标记该js文件可支持 improt 引入。
    // 下面两个是结合使用的。 
    libraryTarget: "umd"  // 标签名总4个。详细文档参见 【webpck  library 配置文档】
    // 1\. UMD:在 AMD 或 CommonJS require 之后可访问
    // 2\. window:在浏览器中通过 window 对象访问
    // 3\. this:通过 this 对象访问
    // 4\. 变量:作为一个全局变量,通过 script 标签来访问
    library: "ImClientService", // 引入全局名称。 这里的设置,和script 中的调用名是对应的。
  }
}

【 webpack entry 入口文档】

【webpack output 出口文档】

【webpck  library 配置文档】

webpack 的配置就完成了。 现在就可以输出库文件了。 

7. 输出库文件

直接调用 webpack 即可, 会在项目目录的 dist 文件得到你的库文件。
一切配置正常,就可得到下面这些信息。 
下面的提示信息大致就说你没有指定模式。这里没有什么用,所以我就没有填写。

8. 如何使用。 

<script type="text/javascript" src="./libs/ImClientService.js"></script> // 直接引入即可

chat.js 文件:
let imClientService = new ImClientService('ws://***:**/**', './libs/SVPro.proto');

完结, 对你有帮助的话,请点个👍。

打字不易,转载请注明出处。

如有问题,或者更高级的用法,欢迎一起讨论。