Index: src/wp-includes/blocks/index.php
===================================================================
--- src/wp-includes/blocks/index.php	(revision 48265)
+++ src/wp-includes/blocks/index.php	(working copy)
@@ -56,3 +56,36 @@
 		ABSPATH . WPINC . '/blocks/' . $block_folder
 	);
 }
+
+// TODO: Move this code to unit tests.
+function register_block_test_block() {
+	wp_register_script( 'my-block-plugin-block-js', null );
+	wp_add_inline_script(
+		'my-block-plugin-block-js',
+		'console.log( "my-block-plugin-block-js" );'
+	);
+	wp_register_script( 'my-block-plugin-block-editor-js', null, array( 'wp-blocks' ) );
+	wp_add_inline_script(
+		'my-block-plugin-block-editor-js',
+		'console.log( "my-block-plugin-block-editor-js" );' .
+		'wp.blocks.registerBlockType( "my-block-plugin/block", { edit() { return "edit my-block-plugin/block"; }, save() { return "content"; } } );'
+	);
+	wp_register_style( 'my-block-plugin-block-css', null );
+	wp_add_inline_style(
+		'my-block-plugin-block-css',
+		'.my-block-plugin-block.css { color: red; }'
+	);
+	wp_register_style( 'my-block-plugin-block-editor-css', null );
+	wp_add_inline_style(
+		'my-block-plugin-block-editor-css',
+		'.my-block-plugin-block.editor-css { color: red; }'
+	);
+	register_block_type( 'my-block-plugin/block', [
+		'title'           => 'My Block',
+		'script'          => 'my-block-plugin-block-js',
+		'editor_script'   => 'my-block-plugin-block-editor-js',
+		'style'           => 'my-block-plugin-block-css',
+		'editor_style'    => 'my-block-plugin-block-editor-css',
+	] );
+}
+add_action( 'init', 'register_block_test_block' );
Index: src/wp-includes/class-wp-block.php
===================================================================
--- src/wp-includes/class-wp-block.php	(revision 48265)
+++ src/wp-includes/class-wp-block.php	(working copy)
@@ -193,15 +193,15 @@
 	 */
 	public function render( $options = array() ) {
 		global $post;
-		$options = wp_parse_args(
+		$options       = wp_parse_args(
 			$options,
 			array(
 				'dynamic' => true,
 			)
 		);
+		$block_content = '';
 
 		$is_dynamic    = $options['dynamic'] && $this->name && null !== $this->block_type && $this->block_type->is_dynamic();
-		$block_content = '';
 
 		if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) {
 			$index = 0;
@@ -218,14 +218,6 @@
 			$post          = $global_post;
 		}
 
-		if ( ! empty( $this->block_type->script ) ) {
-			wp_enqueue_script( $this->block_type->script );
-		}
-
-		if ( ! empty( $this->block_type->style ) ) {
-			wp_enqueue_style( $this->block_type->style );
-		}
-
 		/**
 		 * Filters the content of a single block.
 		 *
@@ -234,7 +226,33 @@
 		 * @param string $block_content The block content about to be appended.
 		 * @param array  $block         The full block, including name and attributes.
 		 */
-		return apply_filters( 'render_block', $block_content, $this->parsed_block );
+		$block_content = apply_filters( 'render_block', $block_content, $this->parsed_block );
+
+		// Print script when it is set. Note that the scripts is not being
+		// enqueued at the wp_enqueue_script action because this could result
+		// in the script being printed when it would never be used. When
+		// a script is printed in the body it has the additional benefit of
+		// not being render-blocking. When a script is printed the first time,
+		// subsequent calls to wp_print_script() will no-op.
+		if ( ! empty( $this->block_type->script ) ) {
+			ob_start();
+			wp_print_scripts( $this->block_type->script );
+			$block_content = trim( ob_get_clean() ) . $block_content;
+		}
+
+		// Print stylesheet when it is set. Note that the stylesheet is not being
+		// enqueued at the wp_enqueue_style action because this could result
+		// in the stylesheet being printed when it would never be used. When
+		// a stylesheet is printed in the body it has the additional benefit of
+		// not being render-blocking. When a stylesheet is printed the first time,
+		// subsequent calls to wp_print_styles() will no-op.
+		if ( ! empty( $this->block_type->style ) ) {
+			ob_start();
+			wp_print_styles( $this->block_type->style );
+			$block_content = trim( ob_get_clean() ) . $block_content;
+		}
+
+		return $block_content;
 	}
 
 }
Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 48265)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -507,7 +507,6 @@
 add_action( 'admin_enqueue_scripts', 'wp_localize_jquery_ui_datepicker', 1000 );
 add_action( 'wp_enqueue_scripts', 'wp_common_block_scripts_and_styles' );
 add_action( 'admin_enqueue_scripts', 'wp_common_block_scripts_and_styles' );
-add_action( 'enqueue_block_assets', 'wp_enqueue_registered_block_scripts_and_styles' );
 add_action( 'enqueue_block_editor_assets', 'wp_enqueue_registered_block_scripts_and_styles' );
 add_action( 'admin_print_scripts-index.php', 'wp_localize_community_events' );
 add_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' );
Index: src/wp-includes/script-loader.php
===================================================================
--- src/wp-includes/script-loader.php	(revision 48265)
+++ src/wp-includes/script-loader.php	(working copy)
@@ -2399,26 +2399,29 @@
 	global $current_screen;
 
 	$is_editor = ( ( $current_screen instanceof WP_Screen ) && $current_screen->is_block_editor() );
+	if ( ! $is_editor ) {
+		return;
+	}
 
 	$block_registry = WP_Block_Type_Registry::get_instance();
 	foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
-		// Front-end styles.
+		// Front-end and editor styles.
 		if ( ! empty( $block_type->style ) ) {
 			wp_enqueue_style( $block_type->style );
 		}
 
-		// Front-end script.
+		// Front-end and editor script.
 		if ( ! empty( $block_type->script ) ) {
 			wp_enqueue_script( $block_type->script );
 		}
 
 		// Editor styles.
-		if ( $is_editor && ! empty( $block_type->editor_style ) ) {
+		if ( ! empty( $block_type->editor_style ) ) {
 			wp_enqueue_style( $block_type->editor_style );
 		}
 
 		// Editor script.
-		if ( $is_editor && ! empty( $block_type->editor_script ) ) {
+		if ( ! empty( $block_type->editor_script ) ) {
 			wp_enqueue_script( $block_type->editor_script );
 		}
 	}
