javascript - Rollup,多个文件,多个文件中相同的常量名称: error in browser: Uncaught SyntaxError: Identifier 'o' has already been declared

标签 javascript constants minify rollupjs terser

我有一个问题。

说明

在我在页面/one 上导航的网站中,one.js 文件中的代码执行良好。

过了一会儿,我在页面中插入(pjax、ajax:无论如何)two.js 文件中的第二个代码。

浏览器提示此错误:

Uncaught SyntaxError: Identifier 'o' has already been declared
- at two.js:1

复制和源代码

  1. rollup.config.js:

    import resolve from 'rollup-plugin-node-resolve'
    import commonjs from 'rollup-plugin-commonjs'
    import { terser } from 'rollup-plugin-terser'
    import multiInput from 'rollup-plugin-multi-input'
    
    export default {
      input: ['src/**/*.js'],
      output: {
        format: 'esm',
        dir: 'dist/js'
      },
      plugins: [
        multiInput({ relative: 'src' }),
        resolve({ browser: true }),
        commonjs(),
        terser()
      ]
    }
    
  2. src/one.js:

    const names1 = ['john1', 'carl1', 'bob1']
    names1.forEach(name1 => {
      console.log('name1:', name1, ', in names1:', ...names1)
    })
    
  3. src/two.js:

    const names2 = ['john2', 'carl2', 'bob2']
    names2.forEach(name2 => {
      console.log('name2:', name2, ', in names2:', ...names2)
    })
    
  4. dist/js/one.js:

    const o=["john1","carl1","bob1"];o.forEach(n=>{console.log("name1:",n,", in names1:",...o)});
    
  5. dist/js/two.js:

    const o=["john2","carl2","bob2"];o.forEach(n=>{console.log("name2:",n,", in names2:",...o)});
    

问题

如何解决这个问题?

我们可以根据文件名为常量名称“添加前缀”吗?

当然,如果我将所有内容都放在 one.js 文件中,它可以工作,但由于项目的结构,这是不可能的。

最佳答案

您选择了output.format: 'esm',这使得 Rollup 假定代码位于它们自己的模块范围内。如果您将它们插入页面中

 <script type="module" src="/dist/js/one.js"></script>
 <script type="module" src="/dist/js/two.js"></script>

我希望它们能够工作。如果您不想使用 type="module",请为 Rollup 使用不同的输出格式,这会将它们包装在模块模式(或 IIFE)中,以赋予它们自己的范围。

关于javascript - Rollup,多个文件,多个文件中相同的常量名称: error in browser: Uncaught SyntaxError: Identifier 'o' has already been declared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57843191/

相关文章:

javascript - 如何在不将整个类放入闭包的情况下使用 YUI 混淆全局变量

android - 我们应该缩小 Cordova 源文件吗?

javascript - 对 javascript 文件进行 Base62 编码是否不好?

php - 将 JavaScript 翻译为 PHP

javascript - 使用切换按钮将 div 滑出屏幕?

javascript - 如何在svg中动态设置坐标点

c++ - 通过 const rerefence 传递 vector 并向 vector 添加元素

javascript - 如何将图像逐层添加到 Canvas ?

c++ - 使用变量实例化模板函数

c++ - 没有从 'Foo' 到 'Foo *const' C++ 的可行转换