使用browserify从es6转换为es5时如何避免模块的全局变量

时间:2017-02-09 14:24:51

标签: ecmascript-6 browserify commonjs babel es6-modules

我正在使用browserify和babel将es6发送到es5:

template <typename C, typename Tuple, int... Is>
auto project_impl(const C& c, const Tuple& indices, 
                  std::integer_sequence<int, Is...>) {
  return std::make_tuple(c[std::get<Is>(indices)]...);
}

template <typename C, typename Tuple>
auto project(const C& c, const Tuple& indices) {
  return project_impl(c, indices,
    std::make_integer_sequence<int, std::tuple_size<Tuple>::value>());
}

在我的employeeModule.js中:

concat: {
            options: {
                sourceMap: false
            },
            dist: {
                src: ["Scripts/app/another.js", "Scripts/app/employee.js"],
                dest: "Scripts/app/built.js"
            }
        },
browserify: {
            dist: {
                options: {
                    transform: [
                    ["babelify", { "presets": ["es2015"] }]]
                },
                files: {
                    "Scripts/app/expParser.js": "Scripts/app/built.js"
                }
            }
        }

在我的employee.js中:

 export const n=10;

现在问题是当我在另一个文件中调用console.log(d)时,即使我没有执行&#34; import &#34;,another.js:< / p>

import {d} from "./employeeModule.js";
 console.log(d) //10

我提到我正在连接:employee.js和another.js一起在浏览器中加载此文件时进行一次调用。这两个文件都是IIFE。 如何防止访问&#34; d&#34; another.js文件中的值?

编译后的代码是这样的:  console.log(d) //10   并且是所有功能的全球性。

1 个答案:

答案 0 :(得分:0)

我确定您不需要concat任务。 Browserify为您完成所有必要的concatenationmodule isolation。你只需要写进口。

例如,您可以删除concat任务,然后只在built.js中留下这两行:

import './another.js';
import './employee.js';

在构建之后,您将发现expParser.js执行这两个模块,其中每个模块的外部都看不到变量。没有任何手动将模块包装到IIFE中。 我想这很接近你的需求。

P.S。请不要忘记提及您下次使用grunt