---
title: Migrating
---
Until we reach version 1.0, there may be occasional changes to the project structure Sapper expects.
### 0.25 to 0.26
The most significant change yet: Sapper is now built on Svelte 3.
#### Importing Sapper
Your app's runtime is now built to `src/node_modules/@sapper` — this allows you to easily import it from anywhere in your source code. Update your `server.js`...
```diff
// src/server.js
-import * as sapper from '../__sapper__/server.js';
+import * as sapper from '@sapper/server';
```
...and client.js:
```diff
-import * as sapper from '../__sapper__/client.js';
+import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
});
```
The same applies to imports like `goto` and `prefetchRoutes`.
#### Webpack config
If you're using webpack, you must update your configuration to recognise `.mjs` and `.svelte` files:
```js
resolve: {
extensions: ['.mjs', '.js', '.json', '.svelte', '.html']
}
```
If you're using .svelte files (recommended), you'll also need to tell `svelte-loader` to expect them:
```diff
-test: /\.html$/
+test: /\.(svelte|html)$/
```
#### Session data
Passing data from server to client is now accomplished with a `session` function passed to the middleware:
```js
// src/server.js
sapper.middleware({
session: (req, res) => ({
// session data goes here
})
})
```
This data is available in `preload` functions as the second argument:
```html
```
#### Stores
It is also available, along with `page` and `preloading`, as a store inside components:
```html
```
`page` and `preloading` are [readable stores](https://svelte.dev/tutorial/readable-stores), while `session` is [writable](https://svelte.dev/tutorial/writable-stores). Writing to the session store (for example, after the user logs in) will cause any `preload` functions that rely on session data to re-run; it will not persist anything to the server.
#### Layouts
Your layout components should now use a `` element to render nested routes, instead of ``:
```diff
-
+
```
The layout component itself receives a `segment` prop, which is equivalent to `child.segment` in earlier versions.
### 0.21 to 0.22
Instead of importing middleware from the `sapper` package, or importing the client runtime from `sapper/runtime.js`, the app is *compiled into* the generated files:
```diff
// src/client.js
-import { init } from 'sapper/runtime.js';
-import { manifest } from './manifest/client.js';
+import * as sapper from '../__sapper__/client.js';
-init({
+sapper.start({
target: document.querySelector('#sapper'),
- manifest
});
```
```diff
// src/server.js
import sirv from 'sirv';
import polka from 'polka';
import compression from 'compression';
-import sapper from 'sapper';
-import { manifest } from './manifest/server.js';
+import * as sapper from '../__sapper__/server.js';
const { PORT, NODE_ENV } = process.env;
const dev = NODE_ENV === 'development';
polka() // You can also use Express
.use(
compression({ threshold: 0 }),
- sirv('assets', { dev }),
+ sirv('static', { dev }),
- sapper({ manifest })
+ sapper.middleware()
)
.listen(PORT, err => {
if (err) console.log('error', err);
});
```
```diff
// src/service-worker.js
-import { assets, shell, routes, timestamp } from './manifest/service-worker.js';
+import { files, shell, routes, timestamp } from '../__sapper__/service-worker.js';
```
In addition, the default build and export directories are now `__sapper__/build` and `__sapper__/export` respectively.
### 0.20 to 0.21
* The `app` directory is now `src`
* The `routes` directory is now `src/routes`
* The `assets` directory is now `static` (remember to update your `src/server.js` file to reflect this change as well)
* Instead of having three separate config files (`webpack/client.config.js`, `webpack/server.config.js` and `webpack/service-worker.config.js`), there is a single `webpack.config.js` file that exports `client`, `server` and `serviceworker` configs.
### 0.17 to 0.18
The `sapper/webpack/config.js` file (required in the `webpack/*.config.js` files) is now `sapper/config/webpack.js`.
### 0.14 to 0.15
This release changed how routing is handled, resulting in a number of changes.
Instead of a single `App.html` component, you can place `_layout.html` components in any directory under `routes`. You should move `app/App.html` to `routes/_layout.html` and modify it like so:
```diff
-
+
-