GVKun编程网logo

你如何在 Webpack 5 中使用 Web Workers?(webpack入门进阶与调优)

5

对于你如何在Webpack5中使用WebWorkers?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webpack入门进阶与调优,并为您提供关于#使用webpack进行版本管理工具(webp

对于你如何在 Webpack 5 中使用 Web Workers?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webpack入门进阶与调优,并为您提供关于# 使用webpack进行版本管理工具(webpack-plugin-auto-version)、(23/24) webpack实战技巧:如何在webpack环境中使用Json、53 webpack概念、webpack核心介绍、webpack使用、ES6+Webpack 下使用 Web Worker的有用信息。

本文目录一览:

你如何在 Webpack 5 中使用 Web Workers?(webpack入门进阶与调优)

你如何在 Webpack 5 中使用 Web Workers?(webpack入门进阶与调优)

我发现了我的问题,

不正确的输出块:

output: {
    publicPath: path.resolve(__dirname,"js/dist/"),filename: "bundle.js",path: path.resolve(__dirname,'js/dist'),}

publicPath 在这种情况下设置为使用绝对路径。因此,当我尝试通过服务器运行它时,它将充当 file:// 而不是通过 http://。由于 Chrome(我相信大多数现代浏览器)出于安全原因不允许您将本地文件作为脚本加载,因此它阻止了它。

最初,我认为使用 typescript 可能存在某种问题,但是,我了解到这只是配置错误导致脚本始终使用绝对值。

更正输出块:

output: {
    publicPath: "js/dist/",}

# 使用webpack进行版本管理工具(webpack-plugin-auto-version)

# 使用webpack进行版本管理工具(webpack-plugin-auto-version)

使用webpack进行版本管理工具(webpack-plugin-auto-version)

出处: https://luoyangfu.com/detail/...

  • GitHub [webpack-plugin-auto-version] https://github.com/zsirfs/web...
  • npm [webpack-plugin-auto-version] https://www.npmjs.com/package...
  • issue https://github.com/zsirfs/web...





距离1.2.3版本以及好几个月了,当时是因为在前端开发中经常会因为缓冲问题,导致最新版本和线上版本或者测试版本出现不同,bug得不到及时有效的修复,手动修改版本可以,但是费时费力,容易出错,设计到动态加载的位置,动态创建脚本的时候就会出错,所以有效的版本管理工具就是能够有效的利用version,自动的根据package.json中version更换major,minor,patch版本。看效果图:
https://cdn-cos.luoyangfu.com/2018-08-01/image/15326711404526.jpg

插件提供配置项

{
    // 文件名替换标记 [version] -> v1.2.2
      filenameMark: options.filenameMark,
      // 版权名称
      copyright: options.copyright || ''[webpack-plugin-auto-version]'',
      // 保存的时候格式化package.json的indent
      space: options.space || 2,
      // 是否自动清理老版本
      cleanup: options.cleanup || false,
      // 是否检测资源内的标签
      inspectContent: options.inspectContent || !!options.template,
      // 自定义资源内版本替换模板 [VERSION]version[/VERSION]
      template: options.template || `[${this.copyright}]version[/${this.copyright}]`,
      // 自定义忽略后缀,默认是[''.html'']忽略html文件打入版本文件夹
      ignoreSuffix: [], // 忽略的后缀或者文件关键词
      isAsyncJs: false,
      htmlTempSuffix: [''.html'', ''.vm'', ''.ejs'', ''.handlbars'']
}
  • filename: 文件名称标记
  • copyright: 版权声明会出现在js,css,html文件头部

https://cdn-cos.luoyangfu.com/2018-08-01/image/15326713793121.jpg

  • space: 版本回存到package.json中的时候格式化间距默认为2字符(之后版本会默认读取.editconfig)
  • cleanup: 自动清除

https://cdn-cos.luoyangfu.com/2018-08-01/image/15326715774000.jpg
存在多个版本的时候可以设置为true,自动清除比当前版本低的文件夹

  • inspectContent: 检测代码内是否有可替换为版本的模板,看设置option.template
  • template: 替换的模板,默认是[webpack-plugin-auto-version]version[/webpack-plugin-auto-version]
  • ignoreSuffix: 配置忽略后缀的文件存放到编译根目录下
  • isAsyncJs: 配置是否是动态创建script的,动态创建script如果是更具publicPath则可用,会在publicPath加入版本号
  • htmlTempSuffix: 按照html语法的后缀,默认是: html, ejs, handlebars,vm 文件等

插件使用方法

安装

npm/yarn:

npm i -D webpack-plugin-auto-version # yarn add -D webpack-plugin-auto-version

配置webpack.config.prod.js

const WebpackPluginAutoVersion = require(''webpack-plugin-auto-version'')

module.exports = {
    // ...忽略其他配置
    plugins: [
        // ...其他插件
        new WebpackPluginAutoVersion()
    ]
    
}

webpack 插件开发

使用webpack插件开发的话需要一个函数对象,函数对象对外暴露apply方法,apply参数有webpack的编译对象complier,其中包含webpack的配置项,编译支援,编译分块,还有webpack的钩子以及其他插件暴露的钩子函数。

看下面代码:

if (complier.hooks) {
      // 兼容webpack ^4.0.0
      complier.hooks.compilation.tap(''WebpackAutoVersionPlugin'', (compliation) => {
        compliation.hooks.htmlWebpackPluginBeforeHtmlGeneration &&
          compliation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tapAsync(
            ''WebpackAutoVersionPlugin'',
            htmlWebpackPluginBeforeHtmlGeneration(this)
          )
        compliation.hooks.htmlWebpackPluginAlterAssetTags &&
          compliation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(
            ''WebpackAutoVersionPlugin'',
            htmlWebpackPluginAlterAssetTags(this)
          )
        compliation.hooks.htmlWebpackPluginAfterHtmlProcessing &&
          compliation.hooks.htmlWebpackPluginAfterHtmlProcessing.tapAsync(
            ''WebpackAutoVersionPlugin'',
            htmlWebpackPluginAfterHtmlProcessing(this)
          )
      })
    } else {
      // 如果存在html-webpack-plugin 则监听
      complier.plugin(''compilation'', (compilation) => {
        compilation.plugin(
          ''html-webpack-plugin-before-html-generation'',
          htmlWebpackPluginBeforeHtmlGeneration(this)
        )
        compilation.plugin(
          ''html-webpack-plugin-alter-asset-tags'',
          htmlWebpackPluginAlterAssetTags(this)
        )
        compilation.plugin(
          ''html-webpack-plugin-after-html-processing'',
          htmlWebpackPluginAfterHtmlProcessing(this)
        )
      })
    }

这里对html-webpack-plugin的钩子函数监听,配合html-webpack-plugin继续网页资源的构造,同时兼容webpack4.x || webpack3.x两种版本。

详细代码查看: L161

GitHub仓库: https://github.com/zsirfs/webpack-plugin-auto-version 欢迎star,fork

问题反馈: issues

(23/24) webpack实战技巧:如何在webpack环境中使用Json

(23/24) webpack实战技巧:如何在webpack环境中使用Json

在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loader的loader进来的。但是在webpack3.x版本中,则不需要在另外引入了,也可使用Json。

下面以webpack3.x为例来说明在webpack中如何使用json。(主要是读取Json内容)

1. webpack中如何使用json

第一步:创建json数据

在根目录下新建一个config.json文件,里面新增如下内容:

{
  "name": "wfaceboss",
  "net": "www.wfaceboss.top"
}

第二步:现在我们的index.html模板中新增一个层,并给层一个Id属性。

便于在javascript代码中可以方便引用。

<div id="json"></div>

第三步:修改入口文件

src/entry.js文件中新增下面代码:

var json =require(''./../config.json'');
document.getElementById("json").innerHTML="name:"+json.name+"  site:"+json.site;

第四步:启动服务查看效果

若此节是根据前面的教程配置了热打包的,此时直接在终端使用npm run server启动即可,便可在浏览器上看到输出效果。若没有配置热打包,则需要先打包后启动服务。

打包指令:

npm run dev

启动服务指令:

npm run server

输出结果为:

53 webpack概念、webpack核心介绍、webpack使用

53 webpack概念、webpack核心介绍、webpack使用

 

53 webpack概念、webpack核心介绍、webpack使用

webpack概念

Webpack 前端资源模块化管理和打包工具。可以将许多松散的模块按照依赖和引用关系打包成符合生产环境部署的前端资源。并将按需加载的模块进行代码分隔,等到实际需要的时候再加载。

开发环境:我们本地的环境或测试环境 development

生产环境:线上环境,比如:我们昨天讲的环境部署 production

为什么学习webpack

搭建前端开发环境(vue、react)、热更新、代码压缩等

但是webpack又依赖node环境 。

node你接口不会写。你会安装node即可。

学习node的两层含义:1、写动态网站(写接口) 2、为前端开发环境服务

webpack官网

 

https://www.webpackjs.com/

 

准备工作

1、先安装node

 

2、安装webpack和webpack-cli

npm i webpack@4 webpack-cli@3 -g

webpack核心介绍

配置文件:webpack.config.js

注意:写js代码,同时webpack基于node,所以也可以写node相关的代码 (不是写http服务)。最多用上:path、和commonjs规范

键名概念解释
context 入口起点 基础目录,绝对路径,用于从配置中解析入口起点(entry point)
entry 入口 (必须) 配置打包入口文件的名字
output 出口 (必须) 打包后输出到哪里, 和输出的文件名
module 加载器配置 在rules对应数组中, 定义对象规则
plugins 插件配置 配置插件功能(插件有着webpack不具备的某些功能,比如:压缩html文件)

webpack只认识js文件,像图片、css、字体件... webpack不认识,不认识的文件使用加载器处理

webpack有很多 的插件 。插件就是丰富webpack功能的。比如:压缩js

webpack使用

打包js代码

1、单入口单出口(主流)

/*
  webpack依赖node环境 。
  这个js文件中,写的虽然是js。但是所有的node相关的都可以写。

*/
const path = require('path')
module.exports = {
   entry:'./src/main.js',
   output:{
       path:path.join( __dirname,'dist' ),//把entry(入口文件)打包到哪个目录 必须是个绝对路径
       filename:'bundle.js',//打包后生成的文件名
  }
}

//默认认为你要打包上线了,上线了就是说要部署到服务器生产环境(要把所有的代码压缩)

2、多入口单出口

module.exports = {
   context:path.join(__dirname,"src"),
   entry:['./main.js','./test1.js'],
   output:{
       path:path.join(__dirname,'dist'),
       filename:'bundle.js'
  }
}

3、多入口多出口

module.exports = {
   context:path.join(__dirname,"src"),
   entry:{
       first:'./main.js',
       second:'./test1.js'
  },
   output:{
       path:path.join(__dirname,'dist'),
       filename:'[name].js'
  }
}

打包css

webpack是基于node的。而node只认识js文件。css是不能直接打包的。所以要找对应认识某文件的loader(加载器)

module属性。

讲这个案例的目的:

1、处理不了文件用对应的loader。webpack对一些loader模块的版本是有要求 。

2、devDependencies深刻认识。(开发依赖) devpendencies:项目依赖

步骤:

css-loader 3版本 style-loader 2版本

npm i css-loader@3 style-loader@2 -D

devDependencies: 开发依赖(上线是不需要的,只是开发的时候才使用),只开发阶段使用,线上不需要。

dependencies:项目依赖,无论上线还是开发阶段都需要,

module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
}

分离css

extract-text-webpack-plugin@next 插件

安装下载

npm i extract-text-webpack-plugin@next -D

加载器修改配置

const ExtractTextPlugin = require("extract-text-webpack-plugin"); 
rules: [ // 加载器的使用规则
{
test: /\.css$/,
use: ExtractTextPlugin.extract({ // 从一个已存在的 loader 中,创建一个提取(extract) loader。
fallback: "style-loader",
use: "css-loader" // loader被用于将资源转换成一个CSS单独文件
})
}
]

插件配置

new ExtractTextPlugin("style.css"), // 输出的文件名

 

报错说明:

Error: Cannot find module 'webpack/lib/Chunk'

解决方案:在项目目录下下载webpack@4

打包less

  • 需要安装less 和 less-loader 来解析less代码, 和加载less文件

    npm i less@3 less-loader@7 -D
  • 在webpack.config.js中 配置加载器, 解析.less文件

    { 
    test: /\.less$/,
    use: ['style-loader', 'css-loader', "less-loader"]
    }
  • 但是这样发现css代码没有分离出来, 所以还需要使用extract-text-webpack-plugin的配置, 分离出css代码

    { 
    test: /\.less$/,
    use: ExtractTextPlugin.extract({
    fallback: "style-loader",
    use: ['css-loader', "less-loader"]
    })
    }
  • 观察打包后style.css中多了less文件里的样式代码

  •  

    生成html

    html-webpack-plugin插件。

    下载

    npm i html-webpack-plugin@4 -D

    注意:插件需要显示的引入到webpack.config.js中

    plugins属性

    plugins:[
    new HtmlWebpackPlugin({ // 插件配置对象
    title: "webpack 的使用",
    filename: "index.html", // 产出文件名(在dist目录查看)
    template: __dirname + "/index.html", // 以此文件来作为基准(注意绝对路径, 因为此文件不在src下)
    favicon: "./assets/favicon.ico", // 插入打包后的favicon图标
    minify: { //对html文件进行压缩,
    collapseBooleanAttributes: true, //是否简写boolean格式的属性如:disabled="disabled"简写为disabled
    minifyCSS: true, //是否压缩html里的css(使用clean-css进行的压缩) 默认值false
    minifyJS: true, //是否压缩html里的js(使用uglify-js进行的压缩)
    removeAttributeQuotes: true, //是否移除属性的引号 默认false
    removeComments: true, //是否移除注释 默认false
    removeCommentsFromCDATA: true, //从脚本和样式删除的注释, 默认false
    }
    }) // 数组元素是插件的new对象
    ]

    报错说明

    Cannot find module "webpack/lib/node/NodeTeplatePlugins"

    在安装html-webpack-plugin插件的工程中, 单独的在本地安装一下跟全局webpack对应的版本

    npm i webpack@4 -D

     

    处理css中的资源(图片和字体)

    我们的背景图片和自定义图标放在src的assets文件夹下。html中引入的图片:logo放置在static文件夹下(不需要打包,它只是copy一份)。

  • 需要下载2个加载器模块

  • url-loader、file-loader

     

  • 下载:

    npm i url-loader file-loader -D

     

    注意: webpack认为, 图片也是一个模块, 所以才需要loader来解析图片)

    2.webpack.config.js加载器配置:

    在module中加上此配置。

     {
    test: /\.(png|jpg|jpeg|gif|svg)$/, // 处理这些结尾的文件
    use: 'url-loader'
    }

    // 如果处理字体图标需要引入这个
    {
    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
    loader: 'url-loader'
    }

    使用jquery(面向模块化开发)

    在webpack打包的项目中, 使用jQuery功能

  • 下载jquery模块,

    npm i jquery

  • 在main.js中引入jquery,

    import $ from 'jquery'

  • 热更新

  • webpack-dev-server会实时监听文件变化, 自动打包到内存中, 而不是生成硬盘上的dist目录

  • webpack-dev-server 它还会启动一个本地的服务器, 来支持你访问打包后的html网页

  • 下载webpack-dev-server -g

  • npm i webpack-dev-server -g

  • webpack-dev-server --version

  • 在项目下运行 命令: webpack-dev-server 可启动热更新服务器, 会根据目录下的webpack.config.js,只是在内存中运行起来了。

  • 注意: 如果修改了配置(webpack.config.js)文件, 还是需要重启终端, 如果是src下的代码, 会自动打包

  • 注意: 默认需要打包输出的文件名必须为 index.html文件

  • 默认在端口号:8080上启动我们热更新服务器, 项目都在这个服务器上打开访问

  • 当开发完毕还需要使用webpack命令进行打包到dist目录 。

  • webpack.config.js配置:

    devServer: { // 在这里可以对webpack-dev-server进行一些配置
    port: 9090, //修改端口号,默认为8080
    open: true, // 自动调用默认浏览器打开
    }

     

     

    ES6+Webpack 下使用 Web Worker

    ES6+Webpack 下使用 Web Worker

    大家都知道 HTML 5 新增了很多 API,其中就包括 Web Worker,在普通的 js 文件上使用 ES5 编写相关代码应该是完全没有问题了,只需要在支持 H5 的浏览器上就能跑起来。

    那如果我们需要在 ES6+Webpack 的组合环境下使用 Web Worker呢?其实也很方便,只需要注意一下个别点,接下来记录一下我踩过的坑。

    至于 Web Worker 的基础知识和基本 api 我就放到最后面当给还不了解或者没有系统使用过的读者们去简单阅读一下。

    1. 快速创建工程环境

    假设你已经有一份 ES6+Webpack 的代码工程环境,而且是可以顺利跑起来的;如果没有,可以 clone 我的 github 仓库:github.com/irm-github/…

    2. 安装及使用 worker-loader

    2.1 安装依赖:

    $ npm install -D worker-loader
    # 或
    $ yarn add worker-loader --dev
    复制代码

    2.2 代码中直接使用 worker-loader

    // main.js
    var MyWorker = require("worker-loader!./file.js");
    // var MyWorker = require("worker-loader?inline=true&fallback=false!./file.js"); var worker = new MyWorker(); worker.postMessage({a: 1}); worker.onmessage = function(event) { /* 操作 */ }; worker.addEventListener("message", function(event) { /* 操作 */ }); 复制代码

    优点:写 worker 逻辑的脚本文件可以任意命名,只要传进 worker-loader 中处理即可; 缺点:每引入一次 worker 逻辑的脚本文件,就需要写一次如上所示的代码,需要多写 N(N>=1) 次的 "worker-loader!"

    2.3 在 webpack 的配置文件中引入 worker-loader

    {
      module: {
        rules: [
          {
            // 匹配 *.worker.js
            test: /\.worker\.js$/,
            use: { loader: ''worker-loader'', options: { name: ''[name]:[hash:8].js'', // inline: true, // fallback: false // publicPath: ''/scripts/workers/'' } } } ] } } 复制代码

    其中配置,可以设置 inline 属性为 true 将 worker 作为 blob 进行内联; 要注意,内联模式将额外为浏览器创建 chunk,即使对于不支持内联 worker 的浏览器也是如此;若这种浏览器想要禁用这种行为,只需要将 fallback 参数设置为 false 即可。

    3. 同源策略

    Web Worker 严格遵守同源策略,如果 webpack 的静态资源与应用代码不是同源的,那么很有可能就被浏览器给墙掉了,而且这种场景也经常发生。对于 Web Worker 遇到这种情况,有两种解决方案。

    3.1 第一种

    通过设置 worker-loader 的选项参数 inline 把 worker 内联成 blob 数据格式,而不再是通过下载脚本文件的方式来使用 worker:

    App.js

    import Worker from ''./file.worker.js'';
    复制代码

    webpack.config.js

    {
      loader: ''worker-loader''
      options: { inline: true }
    }
    复制代码

    3.2 第二种

    通过设置 worker-loader 的选项参数 publicPath 来重写掉 worker 脚本的下载 url,当然脚本也要存放到同样的位置:

    App.js

    // This will cause the worker to be downloaded from `/workers/file.worker.js`
    import Worker from ''./file.worker.js'';
    复制代码

    webpack.config.js

    {
      loader: ''worker-loader''
      options: { publicPath: ''/workers/'' }
    }
    复制代码

    4. devServer 模式下报错 "window is not defined"

    若使用了 webpack-dev-server 启动了本地调试服务器,则有可能会在控制台报错: "Uncaught ReferenceError: window is not defined"

    反正我是遇到了,找了很久未果,当时还是洗了把脸冷静下来排查问题,尝试着先后在 worker-loaderwebpack-dev-serverwebpack 的 github 仓库的 issues 里面去找,最后果然在 webpack 的 github 仓库里找到了码友的提问,官方给出了答案:

    只需要在 webpack 的配置文件下的 output 下,加一个属性对:globalObject: ''this''

    output: {
      path: DIST_PATH,
      publicPath: ''/dist/'',
      filename: ''[name].bundle.[hash:8].js'', chunkFilename: "[name].chunk.[chunkhash:8].js", globalObject: ''this'', }, 复制代码

    5. Web Worker 出现的背景

    JavaScript 引擎是单线程运行的,JavaScript 中耗时的 I/O 操作都被处理为异步操作,它们包括键盘、鼠标 I/O 输入输出事件、窗口大小的 resize 事件、定时器(setTimeoutsetInterval)事件、Ajax 请求网络 I/O 回调等。当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到 JavaScript 运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。

    平时看似够用的异步编程(promiseasync/await),在遇到很复杂的运算,比如说图像的识别优化或转换、H5游戏引擎的实现,加解密算法操作等等,它们的不足就将逐渐体现出来。长时间运行的 js 进程会导致浏览器冻结用户界面,降低用户体验。那有没有什么办法可以将复杂的计算从业务逻辑代码抽离出来,让计算运行的同时不阻塞用户操作界面获得反馈呢?

    HTML5 标准通过了 Web Worker 的规范,该规范定义了一套 api,它允许一段 js 程序运行在主线程之外的另一个线程中。工作线程允许开发人员编写能够长时间运行而不被用户所中断的后台程序, 去执行事务或者逻辑,并同时保证页面对用户的及时响应,可以将一些大量计算的代码交给web worker运行而不冻结用户界面。

    5. Web Worker 的类型

    之前一直认为不就那一种类型吗,哪里还会有多类型的 Worker。答案是有的,其可分为两种类型:

    1. 专用 Worker, Dedicated Web Worker
    2. 共享 Worker, Shared Web Worker

    「专用 Worker」只能被创建它的页面访问,而「共享 Worker」可以在浏览器的多个标签中打开的同一个页面间共享。

    在 js 代码中,Woker 类代表 Dedicated WorkerShared Worker 类代表 Shared Web Worker

    下面的一些示例代码我就直接用 ES5 去写了,上面教了大家怎么使用在 ES6+Webpack 的环境下,迁移这种工作大家就当练习,多动动手。

    6. 如何创建 Worker

    很简单

    // 应用文件 app.js
    var worker = new Worker(''./my.worker.js''); // 传入 worker 脚本文件的路径即可 复制代码

    7. 如何与 worker 通信

    就通过两个方法即可完成:

    应用文件 app.js

    // 创建 worker 实例
    var worker = new Worker(''./my.worker.js''); // 传入 worker 脚本文件的路径即可 // 监听消息 worker.onmessage = function(evt){ // 主线程收到工作线程的消息 }; // 主线程向工作线程发送消息 worker.postMessage({ value: ''主线程向工作线程发送消息'' }); 复制代码

    worker 文件 my.worker.js

    // 监听消息
    this.onmessage = function(evt){ // 工作线程收到主线程的消息 }; this.postMessage({ value: ''工作线程向主线程发送消息'' }); 复制代码

    8. Worker 的全局作用域

    使用 Web Worker 最重要的一点是要知道,它所执行的 js 代码完全在另一作用域中,与当前主线程的代码不共享作用域。在 Web Worker 中,同样有一个全局对象和其他对象以及方法,但其代码无法访问 DOM,也不能影响页面的外观。

    Web Worker 中的全局对象是 worker 对象本身,也即 thisself 引用的都是 worker 对象,说白了,就像上一段在 my.worker.js 的代码,this 完全可以换成 self,甚至可以省略。

    为便于处理数据,Web Worker 本身也是一个最小化的运行环境,其可以访问或使用如下数据:

    • 最小化的 navigator 对象 包括 onLine, appName, appVersion, userAgentplatform 属性
    • 只读的 location 对象
    • setTimeout(), setInterval(), clearTimeout(), clearInterval() 方法
    • XMLHttpRequest 构造函数

    9. 如何终止工作线程

    如果在某个时机不想要 Worker 继续运行了,那么我们需要终止掉这个线程,可以调用在主线程 Worker 的 terminate 方法 或者在相应的线程中调用 close 方法:

    应用文件 app.js

    var worker = new Worker(''./worker.js'');
    // ...一些操作
    worker.terminate();
    复制代码

    Worker 文件 my.worker.js

    self.close();
    复制代码

    10. Worker 的错误处理机制

    具体来说,Worker 内部的 js 在执行过程中只要遇到错误,就会触发 error 事件。发生 error 事件时,事件对象中包含三个属性:filename, linenomessage,分别表示发生错误的文件名、代码行号和完整的错误消息。

    worker.addEventListener(''error'', function (e) {
      console.log(''MAIN: '', ''ERROR'', e); console.log(''filename:'' + e.filename + ''-message:'' + e.message + ''-lineno:'' + e.lineno); }); 复制代码

    11. 引入脚本与库

    Worker 线程能够访问一个全局函数 importScripts() 来引入脚本,该函数接受 0 个或者多个 URI 作为参数来引入资源;以下例子都是合法的:

    importScripts();                        /* 什么都不引入 */
    importScripts(''foo.js'');                /* 只引入 "foo.js" */
    importScripts(''foo.js'', ''bar.js''); /* 引入两个脚本 */ 复制代码

    浏览器加载并运行每一个列出的脚本。每个脚本中的全局对象都能够被 worker 使用。如果脚本无法加载,将抛出 NETWORK_ERROR 异常,接下来的代码也无法执行。而之前执行的代码(包括使用 window.setTimeout() 异步执行的代码)依然能够运行。importScripts() 之后的函数声明依然会被保留,因为它们始终会在其他代码之前运行。

    注意: 脚本的下载顺序不固定,但执行时会按照传入 importScripts() 中的文件名顺序进行。这个过程是同步完成的;直到所有脚本都下载并运行完毕, importScripts() 才会返回。

     

    关于你如何在 Webpack 5 中使用 Web Workers?webpack入门进阶与调优的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于# 使用webpack进行版本管理工具(webpack-plugin-auto-version)、(23/24) webpack实战技巧:如何在webpack环境中使用Json、53 webpack概念、webpack核心介绍、webpack使用、ES6+Webpack 下使用 Web Worker的相关知识,请在本站寻找。

    本文标签: