2017-07-25 73 views
1

我最近使用模塊導入/導出重寫了一堆舊JS到ES2015。我正在使用Rollup和Babel來回傳。ES2015模塊導入污染全局命名空間

該庫被集成到許多其他的網站,我沒有這麼控制我需要的代碼謹慎,以確保我不污染全局,不會引發錯誤等

gulpfile.js

var rollupBabel = rollupPluginBabel({ 
    babelrc: false, 
    presets: [ 
    "babel-preset-es2015-rollup" 
    ] 
}); 

merged.add(rollup({ 
    entry: './js/bnr.js', 
    format: "es", 
    plugins: [ 
    rollupBabel 
    ] 
}) 
.pipe(source('bnr.js')) 
.pipe(gulp.dest('./compiled/js/'))); 

bnr.js

import * as helpers from "../lib/helpers"; 
import moment from "../../node_modules/moment/src/moment"; 

class Connect { 

    constructor(window, document) { 
    this.init(); 
    } 

    init() 
    { 
    // Stuff happens here 
    } 
} 

輸出

// Helpers and what not here 

var hookCallback; 

function hooks() { 
    return hookCallback.apply(null, arguments); 
} 

// This is done to register the method called with moment() 
// without creating circular dependencies. 
function setHookCallback(callback) { 
    hookCallback = callback; 
} 

function isArray(input) { 
    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; 
} 

// The rest of moment.js 

正如你可以看到所有的moment.js相關的代碼將被輸出沒有閉合/包裝,以保持它的全球性的。因此,我在消費網站上收到各種錯誤。

如何導入moment.js或重新配置gulp任務以導入時刻而不污染全局命名空間?

感謝

+0

這看起來像一個commonsjs模塊或暗含模塊範圍的東西 - 它們不是全局變量。嘗試使用UMD作爲輸出格式。 – Bergi

回答

1

正如@Bergi提出的格式是問題,切換到iife包裝在封閉整個事情來解決這個問題。