Javascript - 如何在 webpack 中跨两个函数使用一个变量?

Javascript - How to use a variable across two functions in webpack?

我必须将带有普通 JS 文件的旧的、普通的 HTML 迁移到 webpack,但是当我有一个在函数外部声明并在它们下面的多个函数之间使用的变量时,我遇到了麻烦。

例子之一:

// import stuff

var recorder;
var blobs = [];

function recordStart() {
  recorder = new MediaRecorder(...);
  blobs = []
  recorder.ondataavailable = (event) => {
    console.log("recording");
    if (event.data) blobs.push(event.data);
  };
  recorder.onstop = function(){...};
  recorder.start();
}

function recordEnd() {
  recorder.stop();
}

$('#capture_button').on('touchstart mousedown', function() {
  recordStart();
})
$('#capture_button').on('touchend mouseup', function() {
  recordEnd();
})

但是,每次调用 recordEnd 时,JS 控制台总是在 recorder 对象上抛出 undefined 错误,就好像 recordStart 根本没有触及变量一样功能。

我这里有什么地方做错了吗?我刚学习webpack一个星期,所以如果这是一个菜鸟错误,请多多包涵。

PS。 jQuery 运行 很好,如果我 运行 console.log() 在他们里面他们会正常开火。

编辑:我忘了说这个问题只有在我 运行 npx webpack 使用以下配置后才会发生:

const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  optimization: {
    minimize: false,
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif|glb|gltf|usdz)$/i,
        type: 'asset/resource',
      }
    ]
  },
  plugins: [
    new CopyPlugin({
      patterns: [
        {from: "src/images", to: "images"},
        {from: "src/maps", to: "maps"},
        {from: "src/models", to: "models"}
      ]
    })
  ]
};

它 运行 在我迁移到 webpack 之前,但在我与它捆绑在一起并将 dist/bundle.js 包含在 dist/index.html 的 HTML 之后undefined 错误发生。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Webpack Title</title>
  <script src="./bundle.js"></script>
</head>
<body>
...
</body>
</html>

模块的主要卖点之一是为您的代码提供显式依赖链,并避免使用全局变量。对于您希望能够在其他模块中访问的变量,您应该 export 它们,并且 import 它们在需要的地方。

export let recorder;
// do stuff
// assign to recorder

在另一个模块中

import { recorder } from './theFirstModule';
function recordEnd() {
  recorder.stop();
}

另一个(坏的)选项是使 recorder 显式成为全局的,这样它就可以在任何地方访问 - 但这违背了使用模块的目的并使代码更难推理,所以我不会不推荐。

而不是做

var recorder;

,相反,无论你分配给 recorder,分配给 window.recorder。 (但如果我是你,我真的会先尝试在模块系统中工作)