whitespace in generated code and node modules fixes
diff --git a/lib/src/codegen/module_builder.dart b/lib/src/codegen/module_builder.dart
index 6e20cd3..2dba713 100644
--- a/lib/src/codegen/module_builder.dart
+++ b/lib/src/codegen/module_builder.dart
@@ -89,6 +89,7 @@
     moduleStatements.addAll(_flattenBlocks(moduleItems));
 
     if (_exports.isNotEmpty) {
+      moduleStatements.add(js.comment(''));
       moduleStatements.add(js.comment('Exports:'));
       // TODO(jmesserly): make these immutable in JS?
       _exports.forEach((name, exportName) {
@@ -148,6 +149,7 @@
     moduleStatements.addAll(_flattenBlocks(moduleItems));
 
     if (_exports.isNotEmpty) {
+      moduleStatements.add(js.comment(''));
       moduleStatements.add(js.comment('Exports:'));
       // TODO(jmesserly): make these immutable in JS?
       _exports.forEach((name, exportName) {
@@ -168,19 +170,22 @@
   JS.Program build(String jsPath, String jsModuleValue,
       JS.Identifier exportsVar, Iterable<JS.ModuleItem> moduleItems) {
     var moduleStatements = <JS.ModuleItem>[js.statement("'use strict';"),];
+    moduleStatements.add(js.comment(''));
 
     for (var i in _imports) {
+      var moduleName = js.string(_relativeModuleName(i.name, from: jsPath));
       if (i.libVar == null) {
-        moduleStatements.add(js.statement('require(#);', [js.string(i.name)]));
+        moduleStatements.add(js.statement('require(#);', [moduleName]));
       } else {
         moduleStatements.add(
-            js.statement('let # = require(#);', [i.libVar, js.string(i.name)]));
+            js.statement('let # = require(#);', [i.libVar, moduleName]));
       }
     }
 
     moduleStatements.addAll(_flattenBlocks(moduleItems));
 
     if (_exports.isNotEmpty) {
+      moduleStatements.add(js.comment(''));
       moduleStatements.add(js.comment('Exports:'));
       _exports.forEach((name, exportName) {
         moduleStatements
diff --git a/lib/src/codegen/side_effect_analysis.dart b/lib/src/codegen/side_effect_analysis.dart
index 3a51a46..08f5195 100644
--- a/lib/src/codegen/side_effect_analysis.dart
+++ b/lib/src/codegen/side_effect_analysis.dart
@@ -11,7 +11,7 @@
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/source.dart' show Source;
 
-/// True is the expression can be evaluated multiple times without causing
+/// True if the expression can be evaluated multiple times without causing
 /// code execution. This is true for final fields. This can be true for local
 /// variables, if:
 /// * they are not assigned within the [context].
diff --git a/lib/src/compiler.dart b/lib/src/compiler.dart
index 8e8d7b3..9eecf37 100644
--- a/lib/src/compiler.dart
+++ b/lib/src/compiler.dart
@@ -91,7 +91,7 @@
     _inputBaseDir = options.inputBaseDir;
     if (outputDir != null) {
       _jsGen = new JSGenerator(this);
-      _runtimeOutputDir = path.join(outputDir, 'dev_compiler', 'runtime');
+      _runtimeOutputDir = outputDir;
     }
     _dartCore = context.typeProvider.objectType.element.library;
   }
diff --git a/lib/src/js/printer.dart b/lib/src/js/printer.dart
index 955f6d9..4fb500b 100644
--- a/lib/src/js/printer.dart
+++ b/lib/src/js/printer.dart
@@ -570,6 +570,7 @@
   }
 
   visitFunctionDeclaration(FunctionDeclaration declaration) {
+    lineOut();
     indent();
     outClosureAnnotation(declaration);
     functionOut(declaration.function, declaration.name);
@@ -1088,6 +1089,7 @@
   }
 
   visitClassDeclaration(ClassDeclaration node) {
+    lineOut();
     indent();
     visit(node.classExpr);
     lineOut();
@@ -1332,12 +1334,15 @@
   void visitComment(Comment node) {
     if (shouldCompressOutput) return;
     String comment = node.comment.trim();
-    if (comment.isEmpty) return;
-    for (var line in comment.split('\n')) {
-      if (comment.startsWith('//')) {
-        outIndentLn(line.trim());
-      } else {
-        outIndentLn('// ${line.trim()}');
+    if (comment.isEmpty) {
+      lineOut();
+    } else {
+      for (var line in comment.split('\n')) {
+        if (comment.startsWith('//')) {
+          outIndentLn(line.trim());
+        } else {
+          outIndentLn('// ${line.trim()}');
+        }
       }
     }
   }
diff --git a/test/codegen_test.dart b/test/codegen_test.dart
index 01f5359..402b14b 100644
--- a/test/codegen_test.dart
+++ b/test/codegen_test.dart
@@ -222,8 +222,7 @@
     });
   }
 
-  var expectedRuntime =
-      defaultRuntimeFiles.map((f) => 'dev_compiler/runtime/$f');
+  var expectedRuntime = defaultRuntimeFiles.map((f) => f);
 
   test('devc jscodegen sunflower.html', () {
     var filePath = path.join(inputDir, 'sunflower', 'sunflower.html');