Create entity reference field programmatically in drupal 8

Create  entity refernce field programmatically    below code will  create entity reference field for article content type and target type is basic_page



    $fields['bundle_types'] = array('basic_page' =>  'basic_page'); 

    $fields['fields'] =  array(
                      'fieldname' => array(
                        'type' => 'entity_reference',
                        'entity_type' => 'node',
                        'bundle' => 'article',
                        'title' => t('entity reference field'),
                        'label' => t('entity reference label'),
                        'required' => FALSE,
                        'description' => t('description'),
                        'settings' => array('handler' => 'default:node',
                                            'handler_settings'=> array(
                                                  "target_bundles" =>  $fields['bundle_types'],
                                              ) 
                                            )

                          ),);

   $fields = (object) $fields;


    foreach($fields->fields as $field_name => $config) {
     $field_storage = FieldStorageConfig::loadByName($config['entity_type'], $field_name);
     if(empty($field_storage)) {
        FieldStorageConfig::create(array(
            'field_name' => $field_name,
            'entity_type' => $config['entity_type'],
            'type' => $config['type'],
          ))->save();
     }
    }

    foreach($fields->bundle_types as  $bundle) {
      foreach ($fields->fields as $field_name => $config) {
        $config_array = array(
                'field_name' =>  $field_name,
                'entity_type' => $config['entity_type'],
                'bundle' => $bundle,
                'label' => $config['label'],
                'required' => $config['required'],
                
              );

        if(isset($config['settings'])) {
          $config_array['settings'] = $config['settings'];
        }
        $field = FieldConfig::loadByName($config['entity_type'], $bundle, $field_name);
        if(empty($field) && $bundle !== "" && !empty($bundle)) {
                FieldConfig::create($config_array)->save();
        }

        if($bundle !== "" && !empty($bundle)) {
          if(!empty($field)) {
             $field->setLabel($config['label'])->save();
             $field->setRequired($config['required'])->save();
          }
           if($config['widget']) {
              entity_get_form_display($config['entity_type'], $bundle, 'default')
              ->setComponent($field_name, $config['widget'])
              ->save();
           }
           if($config['formatter']) {  
             foreach ($config['formatter'] as $view => $formatter) {
                if (isset($view_modes[$view]) || $view == "default") { 
                   entity_get_display($config['entity_type'], $bundle, $view)
                  ->setComponent($field_name, !is_array($formatter) ? $config['formatter']['default'] : $formatter)
                  ->save();
                }  
             } 
          } 
        } 
      }
    }
 

Done.