Just in case anyone else finds this - I've gone down the route of using Vue's Async components : https://vuejs.org/v2/guide/components-dynamic-async.html#Async-Components - which combined with the info from the pages above seems to be doing a whole lot of magic I am gladly ignoring for the moment - but it seems to work with a minimum of changes to the code.
A quick how-to:
Install the babel plugin to handle the not-yet-a-standard import() function :
npm install babel-plugin-syntax-dynamic-import --save-dev
Create a .babelrc file in the root of your project :
{
"presets": [
"babel-preset-env"
],
"plugins": [
"babel-plugin-syntax-dynamic-import"
]
}
In your app.js file, where you (or at least I was) doing :
Vue.component("order-form", require("./components/OrderForm.vue"));
Replace those require statements with :
Vue.component("order-form", () => import("./components/OrderForm.vue"));
Now when you run npm run dev (or whatever) webpack will magically split your components into different files and load them via ajax when needed in a template. Webpack will give them fairly unhelpful names - so if you care or want more control you can do :
Vue.component("order-form", () => import("./components/OrderForm.vue" /* webpackChunkName: "js/order-form" */));
Which will spit out the needed js into public/js/order-form.js (the default would be something like public/13.js.
Anyway - it's let me 1/2 the size of my app.js bundle - so that's a win for me. Thanks again to @Cronix and @martinbean for the pointers :-)