--- 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 - + -