I haven't debugged/tested this, but I think you must set a basemap when you declare "map." After you do that, you may be able to use map.setBasemap("streets");
You would need to hide the layers visibility if you wanted the map to show first without a basemap, Then, you should be able to call "setBaseMap" and change it to something else. I suspect it's not working the way you have it because the first layer you add is at index 0... when you try to add the basemap afterwords, it may be conflicting. I haven't actually tested this, but it seems like it could be possible.
The code I gave before would only work for the initial basemap set-up with the map, but you could try this (untested😞
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title>Feature Layer Only Map</title>
<link rel="stylesheet" href="http://js.arcgis.com/3.13/esri/css/esri.css">
<style>
html, body, #map {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="http://js.arcgis.com/3.13/"></script>
<script>
require([
"dojo/dom-construct",
"esri/map",
"esri/layers/FeatureLayer",
"esri/geometry/Extent",
"esri/InfoTemplate",
"dojo/domReady!"
], function(
domConstruct,
Map,
FeatureLayer,
Extent,
InfoTemplate
) {
var bounds = new Extent({
"xmin":-16045622,
"ymin":-811556,
"xmax":7297718,
"ymax":11142818,
"spatialReference":{"wkid":102100}
});
var map = new Map("map", {
extent: bounds,
basemap: "streets"
});
var bm = map.getLayer("layer0");
bm.setVisibility(false);
var url = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/2";
var template = new InfoTemplate("World Regions", "Region: ${REGION}");
var fl = new FeatureLayer(url, {
id: "world-regions",
infoTemplate: template
});
map.addLayer(fl);
map.setBasemap('topo');
bm.setVisibility(true);
}
);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>