diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts
index 2ad2e2e428..c4924697f8 100644
--- a/src/compiler/compile/Component.ts
+++ b/src/compiler/compile/Component.ts
@@ -102,6 +102,7 @@ export default class Component {
 	has_reactive_assignments = false;
 	injected_reactive_declaration_vars: Set<string> = new Set();
 	helpers: Map<string, string> = new Map();
+	globals: Map<string, string> = new Map();
 
 	indirect_dependencies: Map<string, Set<string>> = new Map();
 
@@ -238,6 +239,12 @@ export default class Component {
 		return alias;
 	}
 
+	global(name: string) {
+		const alias = this.alias(name);
+		this.globals.set(name, alias);
+		return alias;
+	}
+
 	generate(result: string) {
 		let js = null;
 		let css = null;
@@ -252,6 +259,10 @@ export default class Component {
 				.replace(/__svelte:self__/g, this.name)
 				.replace(compile_options.generate === 'ssr' ? /(@+|#+)(\w*(?:-\w*)?)/g : /(@+)(\w*(?:-\w*)?)/g, (_match: string, sigil: string, name: string) => {
 					if (sigil === '@') {
+						if (name[0] === '_') {
+							return this.global(name.slice(1));
+						}
+
 						if (!internal_exports.has(name)) {
 							throw new Error(`compiler error: this shouldn't happen! generated code is trying to use inexistent internal '${name}'`);
 						}
@@ -266,6 +277,10 @@ export default class Component {
 					return sigil.slice(1) + name;
 				});
 
+			const referenced_globals = Array.from(this.globals, ([name, alias]) => name !== alias && ({ name, alias })).filter(Boolean);
+			if (referenced_globals.length) {
+				this.helper('globals');
+			}
 			const imported_helpers = Array.from(this.helpers, ([name, alias]) => ({ name, alias }));
 
 			const module = create_module(
@@ -275,6 +290,7 @@ export default class Component {
 				banner,
 				compile_options.sveltePath,
 				imported_helpers,
+				referenced_globals,
 				this.imports,
 				this.vars.filter(variable => variable.module && variable.export_name).map(variable => ({
 					name: variable.name,
diff --git a/src/compiler/compile/create_module.ts b/src/compiler/compile/create_module.ts
index 54b891d4ac..79cb33549c 100644
--- a/src/compiler/compile/create_module.ts
+++ b/src/compiler/compile/create_module.ts
@@ -17,6 +17,7 @@ export default function create_module(
 	banner: string,
 	sveltePath = 'svelte',
 	helpers: Array<{ name: string; alias: string }>,
+	globals: Array<{ name: string; alias: string }>,
 	imports: Node[],
 	module_exports: Export[],
 	source: string
@@ -24,10 +25,10 @@ export default function create_module(
 	const internal_path = `${sveltePath}/internal`;
 
 	if (format === 'esm') {
-		return esm(code, name, banner, sveltePath, internal_path, helpers, imports, module_exports, source);
+		return esm(code, name, banner, sveltePath, internal_path, helpers, globals, imports, module_exports, source);
 	}
 
-	if (format === 'cjs') return cjs(code, name, banner, sveltePath, internal_path, helpers, imports, module_exports);
+	if (format === 'cjs') return cjs(code, name, banner, sveltePath, internal_path, helpers, globals, imports, module_exports);
 
 	throw new Error(`options.format is invalid (must be ${list(Object.keys(wrappers))})`);
 }
@@ -45,6 +46,7 @@ function esm(
 	sveltePath: string,
 	internal_path: string,
 	helpers: Array<{ name: string; alias: string }>,
+	globals: Array<{ name: string; alias: string }>,
 	imports: Node[],
 	module_exports: Export[],
 	source: string
@@ -52,6 +54,9 @@ function esm(
 	const internal_imports = helpers.length > 0 && (
 		`import ${stringify_props(helpers.map(h => h.name === h.alias ? h.name : `${h.name} as ${h.alias}`).sort())} from ${JSON.stringify(internal_path)};`
 	);
+	const internal_globals = globals.length > 0 && (
+		`const ${stringify_props(globals.map(g => `${g.name}: ${g.alias}`).sort())} = ${helpers.find(({ name }) => name === 'globals').alias};`
+	);
 
 	const user_imports = imports.length > 0 && (
 		imports
@@ -70,6 +75,7 @@ function esm(
 	return deindent`
 		${banner}
 		${internal_imports}
+		${internal_globals}
 		${user_imports}
 
 		${code}
@@ -85,6 +91,7 @@ function cjs(
 	sveltePath: string,
 	internal_path: string,
 	helpers: Array<{ name: string; alias: string }>,
+	globals: Array<{ name: string; alias: string }>,
 	imports: Node[],
 	module_exports: Export[]
 ) {
@@ -93,6 +100,9 @@ function cjs(
 	const internal_imports = helpers.length > 0 && (
 		`const ${stringify_props(declarations)} = require(${JSON.stringify(internal_path)});\n`
 	);
+	const internal_globals = globals.length > 0 && (
+		`const ${stringify_props(globals.map(g => `${g.name}: ${g.alias}`).sort())} = ${helpers.find(({ name }) => name === 'globals').alias};`
+	);
 
 	const requires = imports.map(node => {
 		let lhs;
@@ -127,6 +137,7 @@ function cjs(
 		"use strict";
 
 		${internal_imports}
+		${internal_globals}
 		${requires}
 
 		${code}
diff --git a/src/compiler/compile/render-dom/Block.ts b/src/compiler/compile/render-dom/Block.ts
index 15e079ceb9..d7986e167b 100644
--- a/src/compiler/compile/render-dom/Block.ts
+++ b/src/compiler/compile/render-dom/Block.ts
@@ -164,7 +164,7 @@ export default class Block {
 
 		if (parent_node) {
 			this.builders.mount.add_line(`@append(${parent_node}, ${name});`);
-			if (parent_node === '@document.head' && !no_detach) this.builders.destroy.add_line(`@detach(${name});`);
+			if (parent_node === '@_document.head' && !no_detach) this.builders.destroy.add_line(`@detach(${name});`);
 		} else {
 			this.builders.mount.add_line(`@insert(#target, ${name}, anchor);`);
 			if (!no_detach) this.builders.destroy.add_conditional('detaching', `@detach(${name});`);
diff --git a/src/compiler/compile/render-dom/index.ts b/src/compiler/compile/render-dom/index.ts
index 1ba53e7691..3dec1a81b3 100644
--- a/src/compiler/compile/render-dom/index.ts
+++ b/src/compiler/compile/render-dom/index.ts
@@ -44,7 +44,7 @@ export default function dom(
 				var style = @element("style");
 				style.id = '${component.stylesheet.id}-style';
 				style.textContent = ${styles};
-				@append(@document.head, style);
+				@append(@_document.head, style);
 			}
 		`);
 	}
@@ -59,7 +59,7 @@ export default function dom(
 
 	if (options.dev && !options.hydratable) {
 		block.builders.claim.add_line(
-			'throw new @Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");'
+			'throw new @_Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");'
 		);
 	}
 
@@ -108,7 +108,7 @@ export default function dom(
 		} else if (component.compile_options.dev) {
 			body.push(deindent`
 				get ${x.export_name}() {
-					throw new @Error("<${component.tag}>: Props cannot be read directly from the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'");
+					throw new @_Error("<${component.tag}>: Props cannot be read directly from the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'");
 				}
 			`);
 		}
@@ -124,14 +124,14 @@ export default function dom(
 			} else if (component.compile_options.dev) {
 				body.push(deindent`
 					set ${x.export_name}(value) {
-						throw new @Error("<${component.tag}>: Cannot set read-only property '${x.export_name}'");
+						throw new @_Error("<${component.tag}>: Cannot set read-only property '${x.export_name}'");
 					}
 				`);
 			}
 		} else if (component.compile_options.dev) {
 			body.push(deindent`
 				set ${x.export_name}(value) {
-					throw new @Error("<${component.tag}>: Props cannot be set directly on the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'");
+					throw new @_Error("<${component.tag}>: Props cannot be set directly on the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'");
 				}
 			`);
 		}
@@ -147,7 +147,7 @@ export default function dom(
 				const props = ${options.customElement ? `this.attributes` : `options.props || {}`};
 				${expected.map(prop => deindent`
 				if (ctx.${prop.name} === undefined && !('${prop.export_name}' in props)) {
-					@console.warn("<${component.tag}> was created without expected prop '${prop.export_name}'");
+					@_console.warn("<${component.tag}> was created without expected prop '${prop.export_name}'");
 				}`)}
 			`;
 		}
@@ -404,7 +404,7 @@ export default function dom(
 		if (component.compile_options.dev && !component.var_lookup.has('$$props') && writable_props.length) {
 			unknown_props_check = deindent`
 				const writable_props = [${writable_props.map(prop => `'${prop.export_name}'`).join(', ')}];
-				@Object.keys($$props).forEach(key => {
+				@_Object.keys($$props).forEach(key => {
 					if (!writable_props.includes(key) && !key.startsWith('$$')) console.warn(\`<${component.tag}> was created with unknown prop '\${key}'\`);
 				});
 			`;
@@ -483,7 +483,7 @@ export default function dom(
 
 		if (component.tag != null) {
 			builder.add_block(deindent`
-				@customElements.define("${component.tag}", ${name});
+				@_customElements.define("${component.tag}", ${name});
 			`);
 		}
 	} else {
@@ -493,7 +493,7 @@ export default function dom(
 			class ${name} extends @${superclass} {
 				constructor(options) {
 					super(${options.dev && `options`});
-					${should_add_css && `if (!@document.getElementById("${component.stylesheet.id}-style")) ${add_css}();`}
+					${should_add_css && `if (!@_document.getElementById("${component.stylesheet.id}-style")) ${add_css}();`}
 					@init(this, options, ${definition}, create_fragment, ${not_equal}, ${prop_names});
 
 					${dev_props_check}
diff --git a/src/compiler/compile/render-dom/wrappers/Body.ts b/src/compiler/compile/render-dom/wrappers/Body.ts
index feb28ef8f6..623625ce6d 100644
--- a/src/compiler/compile/render-dom/wrappers/Body.ts
+++ b/src/compiler/compile/render-dom/wrappers/Body.ts
@@ -11,11 +11,11 @@ export default class BodyWrapper extends Wrapper {
 			const snippet = handler.render(block);
 
 			block.builders.init.add_block(deindent`
-				@document.body.addEventListener("${handler.name}", ${snippet});
+				@_document.body.addEventListener("${handler.name}", ${snippet});
 			`);
 
 			block.builders.destroy.add_block(deindent`
-				@document.body.removeEventListener("${handler.name}", ${snippet});
+				@_document.body.removeEventListener("${handler.name}", ${snippet});
 			`);
 		});
 	}
diff --git a/src/compiler/compile/render-dom/wrappers/DebugTag.ts b/src/compiler/compile/render-dom/wrappers/DebugTag.ts
index a600e26297..6705b51cc5 100644
--- a/src/compiler/compile/render-dom/wrappers/DebugTag.ts
+++ b/src/compiler/compile/render-dom/wrappers/DebugTag.ts
@@ -62,7 +62,7 @@ export default class DebugTagWrapper extends Wrapper {
 			block.builders.update.add_block(deindent`
 				if (${condition}) {
 					const { ${ctx_identifiers} } = ctx;
-					@console.${log}({ ${logged_identifiers} });
+					@_console.${log}({ ${logged_identifiers} });
 					debugger;
 				}
 			`);
@@ -70,7 +70,7 @@ export default class DebugTagWrapper extends Wrapper {
 			block.builders.create.add_block(deindent`
 				{
 					const { ${ctx_identifiers} } = ctx;
-					@console.${log}({ ${logged_identifiers} });
+					@_console.${log}({ ${logged_identifiers} });
 					debugger;
 				}
 			`);
diff --git a/src/compiler/compile/render-dom/wrappers/EachBlock.ts b/src/compiler/compile/render-dom/wrappers/EachBlock.ts
index dddf415557..3ce2a342a3 100644
--- a/src/compiler/compile/render-dom/wrappers/EachBlock.ts
+++ b/src/compiler/compile/render-dom/wrappers/EachBlock.ts
@@ -190,7 +190,7 @@ export default class EachBlockWrapper extends Wrapper {
 
 		renderer.blocks.push(deindent`
 			function ${this.vars.get_each_context}(ctx, list, i) {
-				const child_ctx = @Object.create(ctx);
+				const child_ctx = @_Object.create(ctx);
 				${this.context_props}
 				return child_ctx;
 			}
@@ -296,7 +296,7 @@ export default class EachBlockWrapper extends Wrapper {
 		const lookup = block.get_unique_name(`${this.var}_lookup`);
 
 		block.add_variable(iterations, '[]');
-		block.add_variable(lookup, `new @Map()`);
+		block.add_variable(lookup, `new @_Map()`);
 
 		if (this.fragment.nodes[0].is_dom_node()) {
 			this.block.first = this.fragment.nodes[0].var;
diff --git a/src/compiler/compile/render-dom/wrappers/Element/Binding.ts b/src/compiler/compile/render-dom/wrappers/Element/Binding.ts
index dd31278774..5b1fe6dee1 100644
--- a/src/compiler/compile/render-dom/wrappers/Element/Binding.ts
+++ b/src/compiler/compile/render-dom/wrappers/Element/Binding.ts
@@ -136,7 +136,7 @@ export default class BindingWrapper {
 			case 'currentTime':
 			case 'playbackRate':
 			case 'volume':
-				update_conditions.push(`!@isNaN(${this.snippet})`);
+				update_conditions.push(`!@_isNaN(${this.snippet})`);
 				break;
 
 			case 'paused':
diff --git a/src/compiler/compile/render-dom/wrappers/Element/index.ts b/src/compiler/compile/render-dom/wrappers/Element/index.ts
index 3602ad301d..1b19281461 100644
--- a/src/compiler/compile/render-dom/wrappers/Element/index.ts
+++ b/src/compiler/compile/render-dom/wrappers/Element/index.ts
@@ -270,7 +270,7 @@ export default class ElementWrapper extends Wrapper {
 				`@append(${parent_node}, ${node});`
 			);
 
-			if (parent_node === '@document.head') {
+			if (parent_node === '@_document.head') {
 				block.builders.destroy.add_line(`@detach(${node});`);
 			}
 		} else {
@@ -379,7 +379,7 @@ export default class ElementWrapper extends Wrapper {
 		}
 
 		if (namespace) {
-			return `@document.createElementNS("${namespace}", "${name}")`;
+			return `@_document.createElementNS("${namespace}", "${name}")`;
 		}
 
 		return `@element("${name}")`;
@@ -465,7 +465,7 @@ export default class ElementWrapper extends Wrapper {
 				block.builders.init.add_block(deindent`
 					function ${handler}() {
 						${animation_frame && deindent`
-						@cancelAnimationFrame(${animation_frame});
+						@_cancelAnimationFrame(${animation_frame});
 						if (!${this.var}.paused) ${animation_frame} = @raf(${handler});`}
 						${needs_lock && `${lock} = true;`}
 						ctx.${handler}.call(${this.var}${contextual_dependencies.size > 0 ? ', ctx' : ''});
diff --git a/src/compiler/compile/render-dom/wrappers/Head.ts b/src/compiler/compile/render-dom/wrappers/Head.ts
index 794506f1be..a5226e7efa 100644
--- a/src/compiler/compile/render-dom/wrappers/Head.ts
+++ b/src/compiler/compile/render-dom/wrappers/Head.ts
@@ -30,6 +30,6 @@ export default class HeadWrapper extends Wrapper {
 	}
 
 	render(block: Block, _parent_node: string, _parent_nodes: string) {
-		this.fragment.render(block, '@document.head', 'nodes');
+		this.fragment.render(block, '@_document.head', 'nodes');
 	}
 }
diff --git a/src/compiler/compile/render-dom/wrappers/IfBlock.ts b/src/compiler/compile/render-dom/wrappers/IfBlock.ts
index 3634091b99..bce4743488 100644
--- a/src/compiler/compile/render-dom/wrappers/IfBlock.ts
+++ b/src/compiler/compile/render-dom/wrappers/IfBlock.ts
@@ -154,7 +154,7 @@ export default class IfBlockWrapper extends Wrapper {
 
 		const vars = { name, anchor, if_name, has_else, has_transitions };
 
-		const detaching = (parent_node && parent_node !== '@document.head') ? '' : 'detaching';
+		const detaching = (parent_node && parent_node !== '@_document.head') ? '' : 'detaching';
 
 		if (this.node.else) {
 			if (has_outros) {
diff --git a/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts b/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts
index 3f09b134f8..f85c48935e 100644
--- a/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts
+++ b/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts
@@ -22,7 +22,7 @@ export default class RawMustacheTagWrapper extends Tag {
 	render(block: Block, parent_node: string, parent_nodes: string) {
 		const name = this.var;
 
-		const in_head = parent_node === '@document.head';
+		const in_head = parent_node === '@_document.head';
 		const needs_anchors = !parent_node || in_head;
 
 		// if in head always needs anchors
diff --git a/src/compiler/compile/render-dom/wrappers/Title.ts b/src/compiler/compile/render-dom/wrappers/Title.ts
index c7f702916c..302c9f1aa9 100644
--- a/src/compiler/compile/render-dom/wrappers/Title.ts
+++ b/src/compiler/compile/render-dom/wrappers/Title.ts
@@ -68,9 +68,9 @@ export default class TitleWrapper extends Wrapper {
 			const init = this.node.should_cache ? `${last} = ${value}` : value;
 
 			block.builders.init.add_line(
-				`@document.title = ${init};`
+				`@_document.title = ${init};`
 			);
-			const updater = `@document.title = ${this.node.should_cache ? last : value};`;
+			const updater = `@_document.title = ${this.node.should_cache ? last : value};`;
 
 			if (all_dependencies.size) {
 				const dependencies = Array.from(all_dependencies);
@@ -95,7 +95,7 @@ export default class TitleWrapper extends Wrapper {
 				? stringify((this.node.children[0] as Text).data)
 				: '""';
 
-			block.builders.hydrate.add_line(`@document.title = ${value};`);
+			block.builders.hydrate.add_line(`@_document.title = ${value};`);
 		}
 	}
 }
diff --git a/src/compiler/compile/render-dom/wrappers/Window.ts b/src/compiler/compile/render-dom/wrappers/Window.ts
index c267b806c9..8c8e6c623d 100644
--- a/src/compiler/compile/render-dom/wrappers/Window.ts
+++ b/src/compiler/compile/render-dom/wrappers/Window.ts
@@ -44,8 +44,8 @@ export default class WindowWrapper extends Wrapper {
 		const events = {};
 		const bindings: Record<string, string> = {};
 
-		add_actions(component, block, '@window', this.node.actions);
-		add_event_handlers(block, '@window', this.node.handlers);
+		add_actions(component, block, '@_window', this.node.actions);
+		add_event_handlers(block, '@_window', this.node.handlers);
 
 		this.node.bindings.forEach(binding => {
 			// in dev mode, throw if read-only values are written to
@@ -92,29 +92,29 @@ export default class WindowWrapper extends Wrapper {
 
 				renderer.meta_bindings.add_block(deindent`
 					if (${condition}) {
-						@window.scrollTo(${x || 'window.pageXOffset'}, ${y || 'window.pageYOffset'});
+						@_scrollTo(${x || '@_pageXOffset'}, ${y || '@pageYOffset'});
 					}
-					${x && `${x} = @window.pageXOffset;`}
-					${y && `${y} = @window.pageYOffset;`}
+					${x && `${x} = @_pageXOffset;`}
+					${y && `${y} = @_pageYOffset;`}
 				`);
 
 				block.event_listeners.push(deindent`
-					@listen(@window, "${event}", () => {
+					@listen(@_window, "${event}", () => {
 						${scrolling} = true;
-						@clearTimeout(${scrolling_timeout});
-						${scrolling_timeout} = @setTimeout(${clear_scrolling}, 100);
+						@_clearTimeout(${scrolling_timeout});
+						${scrolling_timeout} = @_setTimeout(${clear_scrolling}, 100);
 						ctx.${handler_name}();
 					})
 				`);
 			} else {
 				props.forEach(prop => {
 					renderer.meta_bindings.add_line(
-						`this._state.${prop.name} = @window.${prop.value};`
+						`this._state.${prop.name} = @_window.${prop.value};`
 					);
 				});
 
 				block.event_listeners.push(deindent`
-					@listen(@window, "${event}", ctx.${handler_name})
+					@listen(@_window, "${event}", ctx.${handler_name})
 				`);
 			}
 
@@ -126,7 +126,7 @@ export default class WindowWrapper extends Wrapper {
 
 			component.partly_hoisted.push(deindent`
 				function ${handler_name}() {
-					${props.map(prop => `${prop.name} = @window.${prop.value}; $$invalidate('${prop.name}', ${prop.name});`)}
+					${props.map(prop => `${prop.name} = @_window.${prop.value}; $$invalidate('${prop.name}', ${prop.name});`)}
 				}
 			`);
 
@@ -146,13 +146,13 @@ export default class WindowWrapper extends Wrapper {
 					).join(' || ')
 				} && !${scrolling}) {
 					${scrolling} = true;
-					@clearTimeout(${scrolling_timeout});
-					@window.scrollTo(${
-						bindings.scrollX ? `ctx.${bindings.scrollX}` : `@window.pageXOffset`
+					@_clearTimeout(${scrolling_timeout});
+					@_scrollTo(${
+						bindings.scrollX ? `ctx.${bindings.scrollX}` : `@_pageXOffset`
 					}, ${
-						bindings.scrollY ? `ctx.${bindings.scrollY}` : `@window.pageYOffset`
+						bindings.scrollY ? `ctx.${bindings.scrollY}` : `@_pageYOffset`
 					});
-					${scrolling_timeout} = @setTimeout(${clear_scrolling}, 100);
+					${scrolling_timeout} = @_setTimeout(${clear_scrolling}, 100);
 				}
 			`);
 		}
@@ -170,7 +170,7 @@ export default class WindowWrapper extends Wrapper {
 
 			component.partly_hoisted.push(deindent`
 				function ${handler_name}() {
-					${name} = @navigator.onLine; $$invalidate('${name}', ${name});
+					${name} = @_navigator.onLine; $$invalidate('${name}', ${name});
 				}
 			`);
 
@@ -179,8 +179,8 @@ export default class WindowWrapper extends Wrapper {
 			`);
 
 			block.event_listeners.push(
-				`@listen(@window, "online", ctx.${handler_name})`,
-				`@listen(@window, "offline", ctx.${handler_name})`
+				`@listen(@_window, "online", ctx.${handler_name})`,
+				`@listen(@_window, "offline", ctx.${handler_name})`
 			);
 
 			component.has_reactive_assignments = true;
diff --git a/src/compiler/compile/render-ssr/handlers/Element.ts b/src/compiler/compile/render-ssr/handlers/Element.ts
index 637b76aad5..78b95075b2 100644
--- a/src/compiler/compile/render-ssr/handlers/Element.ts
+++ b/src/compiler/compile/render-ssr/handlers/Element.ts
@@ -163,7 +163,7 @@ export default function(node: Element, renderer: Renderer, options: RenderOption
 			node_contents='${(' + snippet + ') || ""}';
 		} else {
 			const snippet = snip(expression);
-			opening_tag += ' ${(v => v ? ("' + name + '" + (v === true ? "" : "=" + @JSON.stringify(v))) : "")(' + snippet + ')}';
+			opening_tag += ' ${(v => v ? ("' + name + '" + (v === true ? "" : "=" + @_JSON.stringify(v))) : "")(' + snippet + ')}';
 		}
 	});
 
diff --git a/src/compiler/compile/render-ssr/handlers/InlineComponent.ts b/src/compiler/compile/render-ssr/handlers/InlineComponent.ts
index 2f407df523..320bf5e6a0 100644
--- a/src/compiler/compile/render-ssr/handlers/InlineComponent.ts
+++ b/src/compiler/compile/render-ssr/handlers/InlineComponent.ts
@@ -52,7 +52,7 @@ export default function(node: InlineComponent, renderer: Renderer, options: Rend
 	let props;
 
 	if (uses_spread) {
-		props = `@Object.assign(${
+		props = `@_Object.assign(${
 			node.attributes
 				.map(attribute => {
 					if (attribute.is_spread) {
diff --git a/src/runtime/internal/animations.ts b/src/runtime/internal/animations.ts
index 0997e9ae23..77c86aff0e 100644
--- a/src/runtime/internal/animations.ts
+++ b/src/runtime/internal/animations.ts
@@ -2,7 +2,7 @@ import { identity as linear, noop, now } from './utils';
 import { loop } from './loop';
 import { create_rule, delete_rule } from './style_manager';
 import { AnimationConfig } from '../animate';
-import { getComputedStyle } from './globals';
+
 
 //todo: documentation says it is DOMRect, but in IE it would be ClientRect
 type PositionRect = DOMRect|ClientRect;
diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts
index c1e16de447..f65d07117c 100644
--- a/src/runtime/internal/dom.ts
+++ b/src/runtime/internal/dom.ts
@@ -1,5 +1,3 @@
-import { document, getComputedStyle, navigator } from './globals';
-
 export function append(target: Node, node: Node) {
 	target.appendChild(node);
 }
diff --git a/src/runtime/internal/globals.ts b/src/runtime/internal/globals.ts
index 314f17dfeb..2f189d0c0a 100644
--- a/src/runtime/internal/globals.ts
+++ b/src/runtime/internal/globals.ts
@@ -1,42 +1 @@
-const win = typeof window !== 'undefined' ? window : global;
-
-const {
-	// ecmascript
-	Error,
-	JSON,
-	Map,
-	Object,
-	console,
-	isNaN,
-
-	// dom
-	cancelAnimationFrame,
-	clearTimeout,
-	customElements,
-	document,
-	getComputedStyle,
-	navigator,
-	requestAnimationFrame,
-	setTimeout: export_setTimeout // TODO: remove when upgrading typescript, bug
-} = win as unknown as typeof globalThis;
-
-export {
-	// ecmascript
-	Error,
-	JSON,
-	Map,
-	Object,
-	console,
-	isNaN,
-
-	// dom
-	cancelAnimationFrame,
-	clearTimeout,
-	customElements,
-	document,
-	getComputedStyle,
-	navigator,
-	requestAnimationFrame,
-	export_setTimeout as setTimeout,
-	win as window,
-};
+export const globals = (typeof window !== 'undefined' ? window : global) as unknown as typeof globalThis;
diff --git a/src/runtime/internal/style_manager.ts b/src/runtime/internal/style_manager.ts
index db8c0e9d17..2721200627 100644
--- a/src/runtime/internal/style_manager.ts
+++ b/src/runtime/internal/style_manager.ts
@@ -1,6 +1,5 @@
 import { element } from './dom';
 import { raf } from './utils';
-import { document } from './globals';
 
 let stylesheet;
 let active = 0;
diff --git a/src/runtime/internal/utils.ts b/src/runtime/internal/utils.ts
index 8624c2246a..5766ac26a5 100644
--- a/src/runtime/internal/utils.ts
+++ b/src/runtime/internal/utils.ts
@@ -1,5 +1,3 @@
-import { requestAnimationFrame } from './globals';
-
 export function noop() {}
 
 export const identity = x => x;