mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-18 13:35:08 +00:00
move webpack config out of sapper, into the app
This commit is contained in:
7
lib/config.js
Normal file
7
lib/config.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
exports.dev = process.env.NODE_ENV !== 'production';
|
||||||
|
|
||||||
|
exports.templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');
|
||||||
|
exports.src = path.resolve(process.env.SAPPER_ROUTES || 'routes');
|
||||||
|
exports.dest = path.resolve(process.env.SAPPER_DEST || '.sapper');
|
||||||
16
lib/route_manager.js
Normal file
16
lib/route_manager.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
const glob = require('glob');
|
||||||
|
const create_routes = require('../utils/create_routes.js');
|
||||||
|
const { src } = require('./config.js');
|
||||||
|
|
||||||
|
const route_manager = {
|
||||||
|
routes: create_routes(
|
||||||
|
glob.sync('**/*.+(html|js|mjs)', { cwd: src })
|
||||||
|
),
|
||||||
|
|
||||||
|
onchange(fn) {
|
||||||
|
// TODO in dev mode, keep this updated, and allow
|
||||||
|
// webpack compiler etc to hook into it
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = route_manager;
|
||||||
@@ -12,15 +12,11 @@
|
|||||||
"webpack": "^3.10.0"
|
"webpack": "^3.10.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"extract-text-webpack-plugin": "^3.0.2",
|
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
"svelte": "^1.47.1",
|
"svelte": "^1.47.1"
|
||||||
"svelte-loader": "^2.2.1"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"extract-text-webpack-plugin": "^3.0.2",
|
"svelte": "^1.47.1"
|
||||||
"svelte": "^1.47.1",
|
|
||||||
"svelte-loader": "^2.2.1"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha --opts mocha.opts"
|
"test": "mocha --opts mocha.opts"
|
||||||
|
|||||||
@@ -9,85 +9,13 @@ const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
|
|||||||
module.exports = function create_webpack_compiler(out, routes, dev) {
|
module.exports = function create_webpack_compiler(out, routes, dev) {
|
||||||
const compiler = {};
|
const compiler = {};
|
||||||
|
|
||||||
const client = webpack({
|
const client = webpack(
|
||||||
entry: {
|
require(path.resolve('webpack.client.config.js'))
|
||||||
main: `${out}/main`
|
);
|
||||||
},
|
|
||||||
resolve: {
|
|
||||||
extensions: ['.js', '.html']
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
path: `${out}/client`,
|
|
||||||
filename: '[name].[hash].js',
|
|
||||||
chunkFilename: '[name].[id].js',
|
|
||||||
publicPath: '/client/'
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.html$/,
|
|
||||||
exclude: /node_modules/,
|
|
||||||
use: {
|
|
||||||
loader: 'svelte-loader',
|
|
||||||
options: {
|
|
||||||
emitCss: true,
|
|
||||||
cascade: false,
|
|
||||||
store: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.css$/,
|
|
||||||
use: ExtractTextPlugin.extract({
|
|
||||||
fallback: 'style-loader',
|
|
||||||
use: [{ loader: 'css-loader', options: { sourceMap: dev } }]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new ExtractTextPlugin('main.css'),
|
|
||||||
!dev && new webpack.optimize.ModuleConcatenationPlugin(),
|
|
||||||
!dev && new UglifyJSPlugin()
|
|
||||||
].filter(Boolean),
|
|
||||||
devtool: dev ? 'inline-source-map' : false
|
|
||||||
});
|
|
||||||
|
|
||||||
const server_entries = {};
|
const server = webpack(
|
||||||
routes.forEach(route => {
|
require(path.resolve('webpack.server.config.js'))
|
||||||
server_entries[route.id] = path.resolve('routes', route.file);
|
);
|
||||||
});
|
|
||||||
|
|
||||||
const server = webpack({
|
|
||||||
entry: server_entries,
|
|
||||||
target: 'node',
|
|
||||||
resolve: {
|
|
||||||
extensions: ['.js', '.html']
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
path: `${out}/server`,
|
|
||||||
filename: '[name].[hash].js',
|
|
||||||
chunkFilename: '[name].[id].js',
|
|
||||||
libraryTarget: 'commonjs2'
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.html$/,
|
|
||||||
exclude: /node_modules/,
|
|
||||||
use: {
|
|
||||||
loader: 'svelte-loader',
|
|
||||||
options: {
|
|
||||||
css: false,
|
|
||||||
cascade: false,
|
|
||||||
store: true,
|
|
||||||
generate: 'ssr'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (false) { // TODO watch in dev
|
if (false) { // TODO watch in dev
|
||||||
// TODO how can we invalidate compiler.client_main when watcher restarts?
|
// TODO how can we invalidate compiler.client_main when watcher restarts?
|
||||||
@@ -107,7 +35,7 @@ module.exports = function create_webpack_compiler(out, routes, dev) {
|
|||||||
compiler.client_main = new Promise((fulfil, reject) => {
|
compiler.client_main = new Promise((fulfil, reject) => {
|
||||||
client.run((err, stats) => {
|
client.run((err, stats) => {
|
||||||
if (err || stats.hasErrors()) {
|
if (err || stats.hasErrors()) {
|
||||||
console.log(stats.toString());
|
console.log(stats.toString({ colors: true }));
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +48,7 @@ module.exports = function create_webpack_compiler(out, routes, dev) {
|
|||||||
server.run((err, stats) => {
|
server.run((err, stats) => {
|
||||||
if (err || stats.hasErrors()) {
|
if (err || stats.hasErrors()) {
|
||||||
// TODO deal with hasErrors
|
// TODO deal with hasErrors
|
||||||
console.log(stats.toString());
|
console.log(stats.toString({ colors: true }));
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
43
webpack/config.js
Normal file
43
webpack/config.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const route_manager = require('../lib/route_manager.js');
|
||||||
|
const { src, dest, dev } = require('../lib/config.js');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
dev,
|
||||||
|
|
||||||
|
client: {
|
||||||
|
entry: () => {
|
||||||
|
return {
|
||||||
|
main: `${dest}/main.js`
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
output: () => {
|
||||||
|
return {
|
||||||
|
path: `${dest}/client`,
|
||||||
|
filename: '[name].[hash].js',
|
||||||
|
chunkFilename: '[name].[id].js',
|
||||||
|
publicPath: '/client/'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
server: {
|
||||||
|
entry: () => {
|
||||||
|
const entries = {};
|
||||||
|
route_manager.routes.forEach(route => {
|
||||||
|
entries[route.id] = path.resolve(src, route.file);
|
||||||
|
});
|
||||||
|
return entries;
|
||||||
|
},
|
||||||
|
|
||||||
|
output: () => {
|
||||||
|
return {
|
||||||
|
path: `${dest}/server`,
|
||||||
|
filename: '[name].[hash].js',
|
||||||
|
chunkFilename: '[name].[id].js',
|
||||||
|
libraryTarget: 'commonjs2'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user