Update Rollup to use HMR with Sapper

This commit is contained in:
2020-02-05 16:12:35 +01:00
parent 635576847d
commit 4388d34333
7 changed files with 2110 additions and 623 deletions

View File

@@ -9,8 +9,8 @@
}, },
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "sapper dev", "dev": "sapper dev --port 3000",
"build": "sapper build dist --legacy", "build": "sapper build dist",
"export": "sapper export export", "export": "sapper export export",
"start": "node __sapper__/build", "start": "node __sapper__/build",
"serve": "node server/server.js" "serve": "node server/server.js"
@@ -20,42 +20,41 @@
"animejs": "^3.1.0", "animejs": "^3.1.0",
"bulma": "^0.8.0", "bulma": "^0.8.0",
"compression": "^1.7.4", "compression": "^1.7.4",
"dayjs": "^1.8.18", "dayjs": "^1.8.19",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"polka": "^1.0.0-next.9", "polka": "^1.0.0-next.9",
"shufflejs": "^5.2.3", "shufflejs": "^5.2.3",
"sirv": "^0.4.2" "sirv": "^0.4.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.7.7", "@babel/core": "^7.8.4",
"@babel/plugin-syntax-dynamic-import": "^7.7.4", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.7.6", "@babel/plugin-transform-runtime": "^7.8.3",
"@babel/preset-env": "^7.7.7", "@babel/preset-env": "^7.8.4",
"@babel/runtime": "^7.7.7", "@babel/runtime": "^7.8.4",
"@rollup/plugin-node-resolve": "^6.0.0", "@rollup/plugin-commonjs": "^11.0.2",
"@rollup/plugin-replace": "^2.3.0", "@rollup/plugin-node-resolve": "^7.1.1",
"autoprefixer": "^9.7.3", "@rollup/plugin-replace": "^2.3.1",
"autoprefixer": "^9.7.4",
"eslint-plugin-svelte3": "^2.7.3", "eslint-plugin-svelte3": "^2.7.3",
"node-sass": "^4.13.0", "node-sass": "^4.13.1",
"postcss": "^7.0.26", "postcss": "^7.0.26",
"postcss-load-config": "^2.1.0", "postcss-load-config": "^2.1.0",
"postcss-preset-env": "^6.7.0", "postcss-preset-env": "^6.7.0",
"rollup": "^1.27.14", "rollup": "^1.31.0",
"rollup-plugin-babel": "^4.3.3", "rollup-plugin-babel": "^4.3.3",
"rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-hot": "^0.0.10",
"rollup-plugin-svelte": "^5.1.1", "rollup-plugin-svelte": "^5.1.1",
"rollup-plugin-terser": "^5.1.3", "rollup-plugin-svelte-hot": "^0.1.1",
"rollup-plugin-terser": "^5.2.0",
"sapper": "^0.27.9", "sapper": "^0.27.9",
"sass": "^1.24.0", "svelte": "^3.18.1",
"svelte": "^3.16.7", "svelte-preprocess": "^3.4.0"
"svelte-preprocess": "^3.3.0"
}, },
"browserslist": [ "browserslist": [
"ie >= 11", "> 0.5%",
"last 7 ff versions", "last 2 versions",
"last 7 chrome versions", "not dead"
"safari >= 10",
"ios >= 11",
"android >= 7"
] ]
} }

2559
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,35 +1,29 @@
const pkg = require('./package.json')
const dev = process.env.NODE_ENV === 'development' const dev = process.env.NODE_ENV === 'development'
let config = { module.exports = () => ({
plugins: { plugins: [
// Preset Env // Preset Env
'postcss-preset-env': { require('postcss-preset-env')({}),
},
// Autoprefixer // Autoprefixer
autoprefixer: { require('autoprefixer')({}),
},
// Extract media queries // Extract media queries
// 'postcss-combine-media-query': { // require('postcss-combine-media-query')({}),
// } // CSS Nano
} !dev && require('cssnano')({
}
// Production only
// CSS Nano for production
if (!dev) {
config.plugins.cssnano = {
preset: 'default', preset: 'default',
autoprefixer: true, autoprefixer: true,
discardComments: { removeAll: true }, discardComments: { removeAll: true },
calc: { precision: 2 }, calc: { precision: 2 },
safe: true safe: true
} }),
}
// Export // Banner
module.exports = config !dev && require('postcss-banner')({
banner: `${pkg.name} v${pkg.version} \nBy ${pkg.author.name} \n${pkg.author.url}`
})
]
})

View File

@@ -1,66 +1,86 @@
import resolve from '@rollup/plugin-node-resolve' import resolve from '@rollup/plugin-node-resolve'
import replace from '@rollup/plugin-replace' import replace from '@rollup/plugin-replace'
import commonjs from 'rollup-plugin-commonjs' import commonjs from '@rollup/plugin-commonjs'
import svelte from 'rollup-plugin-svelte' // import svelte from 'rollup-plugin-svelte'
import svelte from 'rollup-plugin-svelte-hot'
import babel from 'rollup-plugin-babel' import babel from 'rollup-plugin-babel'
// import browsersync from 'rollup-plugin-browsersync'
import hmr from 'rollup-plugin-hot'
import sveltePreprocess from 'svelte-preprocess' import sveltePreprocess from 'svelte-preprocess'
import { terser } from 'rollup-plugin-terser' import { terser } from 'rollup-plugin-terser'
import config from 'sapper/config/rollup.js' import config from 'sapper/config/rollup.js'
import pkg from './package.json' import pkg from './package.json'
// Define environment // Define environment and things
const mode = process.env.NODE_ENV const mode = process.env.NODE_ENV
const dev = mode === 'development' const dev = mode === 'development'
const legacy = !!process.env.SAPPER_LEGACY_BUILD const legacy = !!process.env.SAPPER_LEGACY_BUILD
const hot = dev
// Svelte
const onwarn = (warning, onwarn) => (warning.code === 'CIRCULAR_DEPENDENCY' && /[/\\]@sapper[/\\]/.test(warning.message)) || onwarn(warning) const onwarn = (warning, onwarn) => (warning.code === 'CIRCULAR_DEPENDENCY' && /[/\\]@sapper[/\\]/.test(warning.message)) || onwarn(warning)
const dedupe = importee => importee === 'svelte' || importee.startsWith('svelte/')
// Preprocessors // Preprocessors
const preprocess = sveltePreprocess({ const preprocess = sveltePreprocess({
scss: { scss: { includePaths: ['node_modules', 'src'] },
includePaths: ['node_modules', 'src'] postcss: true
},
postcss: {
configFilePath: './'
}
}) })
// Sapper Rollup config // Sapper Rollup config
export default { export default {
client: { client: {
input: config.client.input(), input: config.client.input(),
output: config.client.output(), output: {
...config.client.output(),
...dev && { exports: 'named' }
},
experimentalCodeSplitting: true, experimentalCodeSplitting: true,
plugins: [ plugins: [
// Javascript
svelte({
// css: css => css.write('public/bundle.css'),
dev,
preprocess,
hydratable: true,
// emitCss: true,
...(!hot && {
css: css => {
css.write('public/bundle.css')
},
}),
hot: hot && {
// sapper-dev-client expects either webpack or rollup with no HMR, so
// we need to prevent it from doing full reloads with rollup
patchSapperDevClient: true,
// optimistic will try to recover from runtime errors during
// component init (instead of doing a full reload)
optimistic: true,
}
}),
replace({ replace({
'process.browser': true, 'process.browser': true,
'process.env.NODE_ENV': JSON.stringify(mode) 'process.env.NODE_ENV': JSON.stringify(mode)
}), }),
svelte({
css: css => {
css.write('public/bundle.css')
},
preprocess,
dev,
hydratable: true,
emitCss: true,
}),
resolve({ resolve({
browser: true, browser: true,
dedupe extensions: ['.mjs', '.js', '.json', '.html', '.svelte', '.scss'],
dedupe: ['svelte']
}), }),
commonjs(), commonjs(),
legacy && !hot && babel({
legacy && babel({
extensions: ['.js', '.mjs', '.html', '.svelte'], extensions: ['.js', '.mjs', '.html', '.svelte'],
exclude: ['node_modules/@babel/**'], exclude: ['node_modules/@babel/**'],
runtimeHelpers: true runtimeHelpers: true
}), }),
hot && hmr({
public: '__sapper__/dev',
inMemory: true,
}),
// Compress Javascript
!dev && terser({ !dev && terser({
module: true module: true
}) }),
], ],
onwarn, onwarn,
@@ -75,13 +95,14 @@ export default {
'process.env.NODE_ENV': JSON.stringify(mode) 'process.env.NODE_ENV': JSON.stringify(mode)
}), }),
svelte({ svelte({
dev,
preprocess, preprocess,
generate: 'ssr', generate: 'ssr'
dev
}), }),
resolve({ resolve({
browser: true, browser: true,
dedupe extensions: ['.mjs', '.js', '.json', '.html', '.svelte', '.scss'],
dedupe: ['svelte']
}), }),
commonjs(), commonjs(),
], ],

View File

@@ -1,5 +1,6 @@
import * as sapper from '@sapper/app' import * as sapper from '@sapper/app'
// Start Sapper
sapper.start({ sapper.start({
target: document.getElementById('site') target: document.getElementById('site')
}) })

View File

@@ -3,10 +3,12 @@ import polka from 'polka'
import compression from 'compression' import compression from 'compression'
import * as sapper from '@sapper/server' import * as sapper from '@sapper/server'
// Define environment
const { PORT, NODE_ENV } = process.env const { PORT, NODE_ENV } = process.env
const dev = NODE_ENV === 'development' const dev = NODE_ENV === 'development'
polka() // You can also use Express // Setup server
polka()
.use( .use(
compression({ threshold: 0 }), compression({ threshold: 0 }),
sirv('static', { dev }), sirv('static', { dev }),

View File

@@ -7,6 +7,7 @@ const ASSETS = `cache${timestamp}`
const to_cache = shell.concat(files) const to_cache = shell.concat(files)
const cached = new Set(to_cache) const cached = new Set(to_cache)
// Install
self.addEventListener('install', event => { self.addEventListener('install', event => {
event.waitUntil( event.waitUntil(
caches caches
@@ -18,6 +19,7 @@ self.addEventListener('install', event => {
) )
}) })
// Activate
self.addEventListener('activate', event => { self.addEventListener('activate', event => {
event.waitUntil( event.waitUntil(
caches.keys().then(async keys => { caches.keys().then(async keys => {
@@ -31,6 +33,7 @@ self.addEventListener('activate', event => {
) )
}) })
// Fetch
self.addEventListener('fetch', event => { self.addEventListener('fetch', event => {
if (event.request.method !== 'GET' || event.request.headers.has('range')) return if (event.request.method !== 'GET' || event.request.headers.has('range')) return