|
| 1 | +--- |
| 2 | +pcx_content_type: navigation |
| 3 | +title: Local data |
| 4 | +sidebar: |
| 5 | + order: 2 |
| 6 | +head: [] |
| 7 | +description: Working with data during local development |
| 8 | +--- |
| 9 | + |
| 10 | +import { |
| 11 | + Details, |
| 12 | + LinkCard, |
| 13 | + Render, |
| 14 | + PackageManagers, |
| 15 | + FileTree, |
| 16 | + Aside, |
| 17 | +} from "~/components"; |
| 18 | + |
| 19 | +Whether you are using Wrangler or the [Cloudflare Vite plugin](https://developers.cloudflare.com/workers/vite-plugin/), your workflow for **accessing** data during local development remains the same. However, you can only [populate local resources with data](/workers/local-development/local-data/#populating-local-resources-with-data) via the Wrangler CLI. |
| 20 | + |
| 21 | +### How it works |
| 22 | + |
| 23 | +When you run either `wrangler dev` or [`vite`](https://vite.dev/guide/cli#dev-server), [Miniflare](/workers/testing/miniflare/) automatically creates **local versions** of your resources (like [KV](/kv), [D1](/d1/), or [R2](/r2)). This means you **don’t** need to manually set up separate local instances for each service. However, newly created local resources **won’t** contain any data — you'll need to use Wrangler commands with the `--local` flag to populate them. Changes made to local resources won’t affect production data. |
| 24 | + |
| 25 | +## Populating local resources with data |
| 26 | + |
| 27 | +When you first start developing, your local resources will be empty. You'll need to populate them with data using the Wrangler CLI. |
| 28 | + |
| 29 | +### KV namespaces |
| 30 | + |
| 31 | +<Aside type="caution" title="Syntax note"> |
| 32 | + |
| 33 | +Since version 3.60.0, Wrangler supports the `kv ...` syntax. If you are using versions below 3.60.0, the command follows the `kv:...` syntax. Learn more in the [Wrangler commands for KV page](/kv/reference/kv-commands/). |
| 34 | + |
| 35 | +</Aside> |
| 36 | + |
| 37 | +#### [Add a single key-value pair](/workers/wrangler/commands/#kv-key) |
| 38 | + |
| 39 | +<PackageManagers |
| 40 | + type="exec" |
| 41 | + pkg="wrangler" |
| 42 | + args="kv key put <KEY> <VALUE> --binding=<BINDING> --local " |
| 43 | +/> |
| 44 | + |
| 45 | +#### [Buld upload](/workers/wrangler/commands/#kv-bulk) |
| 46 | + |
| 47 | +<PackageManagers |
| 48 | + type="exec" |
| 49 | + pkg="wrangler" |
| 50 | + args="kv bulk put <FILENAME.json> --binding=<BINDING> --local" |
| 51 | +/> |
| 52 | + |
| 53 | +### R2 buckets |
| 54 | + |
| 55 | +#### [Upload a file](/workers/wrangler/commands/#r2-object) |
| 56 | + |
| 57 | +<PackageManagers |
| 58 | + type="exec" |
| 59 | + pkg="wrangler" |
| 60 | + args="r2 object put <BUCKET>/<KEY> --file=<PATH_TO_FILE> --local" |
| 61 | +/> |
| 62 | + |
| 63 | +You may also include [other metadata](/workers/wrangler/commands/#r2-object-put). |
| 64 | + |
| 65 | +### D1 databases |
| 66 | + |
| 67 | +#### [Execute a SQL statement](/workers/wrangler/commands/#d1-execute) |
| 68 | + |
| 69 | +<PackageManagers |
| 70 | + type="exec" |
| 71 | + pkg="wrangler" |
| 72 | + args='d1 execute <DATABASE_NAME> --command="<SQL_QUERY>" --local' |
| 73 | +/> |
| 74 | + |
| 75 | +#### [Execute a SQL file](/workers/wrangler/commands/#d1-execute) |
| 76 | + |
| 77 | +<PackageManagers |
| 78 | + type="exec" |
| 79 | + pkg="wrangler" |
| 80 | + args="wrangler d1 execute <DATABASE_NAME> --file=./schema.sql --local" |
| 81 | +/> |
| 82 | + |
| 83 | +### Durable Objects |
| 84 | + |
| 85 | +For Durable Objects, unlike KV, D1, and R2, there are no CLI commands to populate them with local data. To add data to Durable Objects during local development, you must write application code that creates Durable Object instances and [calls methods on them that store state](/durable-objects/best-practices/access-durable-objects-storage/). This typically involves creating development endpoints or test routes that initialize your Durable Objects with the desired data. |
| 86 | + |
| 87 | +## Where local data gets stored |
| 88 | + |
| 89 | +By default, both Wrangler and the Vite plugin store local binding data in the same location: the `.wrangler/state` folder in your project directory. This folder stores data in subdirectories for all local bindings: KV namespaces, R2 buckets, D1 databases, Durable Objects, etc. |
| 90 | + |
| 91 | +### Clearing local storage |
| 92 | + |
| 93 | +You can delete the `.wrangler/state` folder at any time to reset your local environment, and Miniflare will recreate it the next time you run your `dev` command. You can also delete specific sub-folders within `.wrangler/state` for more targeted clean-up. |
| 94 | + |
| 95 | +### Changing the local data directory |
| 96 | + |
| 97 | +If you prefer to specify a different directory for local storage, you can do so through the Wranlger CLI or in the Vite plugin's configuration. |
| 98 | + |
| 99 | +#### Using Wrangler |
| 100 | + |
| 101 | +Use the [`--persist-to`](/workers/wrangler/commands/#dev) flag with `wrangler dev`. You need to specify this flag every time you run the `dev` command: |
| 102 | + |
| 103 | +<PackageManagers |
| 104 | + type="exec" |
| 105 | + pkg="wrangler" |
| 106 | + args="dev --persist-to <DIRECTORY>" |
| 107 | +/> |
| 108 | + |
| 109 | +:::note |
| 110 | +The local persistence folder (like `.wrangler/state` or any custom folder you set) should be added to your `.gitignore` to avoid committing local development data to version control. |
| 111 | +::: |
| 112 | + |
| 113 | +<Details header="Using `--local` with `--persist-to`"> |
| 114 | +If you run `wrangler dev --persist-to <DIRECTORY>` to specify a custom location for local data, you must also include the same `--persist-to <DIRECTORY>` when running other Wrangler commands that modify local data (and be sure to include the `--local` flag). |
| 115 | + |
| 116 | +For example, to create a KV key named `test` with a value of `12345` in a local KV namespace, run: |
| 117 | + |
| 118 | +<PackageManagers |
| 119 | + type="exec" |
| 120 | + pkg="wrangler" |
| 121 | + args="kv key put test 12345 --binding MY_KV_NAMESPACE --local --persist-to worker-local" |
| 122 | +/> |
| 123 | + |
| 124 | +This command: |
| 125 | + |
| 126 | +- Sets the KV key `test` to `12345` in the binding `MY_KV_NAMESPACE` (defined in your [Wrangler configuration file](/workers/wrangler/configuration/)). |
| 127 | +- Uses `--persist-to worker-local` to ensure the data is created in the **worker-local** directory instead of the default `.wrangler/state`. |
| 128 | +- Adds the `--local` flag, indicating you want to modify local data. |
| 129 | + |
| 130 | +If `--persist-to` is not specified, Wrangler defaults to using `.wrangler/state` for local data. |
| 131 | + |
| 132 | +</Details> |
| 133 | + |
| 134 | +#### Using the Cloudflare Vite plugin |
| 135 | + |
| 136 | +To customize where the Vite plugin stores local data, configure the [`persistState` option](/workers/vite-plugin/reference/api/#interface-pluginconfig) in your Vite config file: |
| 137 | + |
| 138 | +```js title="vite.config.js" |
| 139 | +import { defineConfig } from "vite"; |
| 140 | +import { cloudflare } from "@cloudflare/vite-plugin"; |
| 141 | + |
| 142 | +export default defineConfig({ |
| 143 | + plugins: [ |
| 144 | + cloudflare({ |
| 145 | + persistState: "./my-custom-directory", |
| 146 | + }), |
| 147 | + ], |
| 148 | +}); |
| 149 | +``` |
| 150 | + |
| 151 | +#### Sharing state between tools |
| 152 | + |
| 153 | +If you want Wrangler and the Vite plugin to share the same state, configure them to use the same persistence path. |
0 commit comments