Skip to content

Commit a8626ec

Browse files
committed
prefer load configurations from js-yaml
1 parent 5b9b277 commit a8626ec

File tree

6 files changed

+69
-14
lines changed

6 files changed

+69
-14
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@ You can put `app/assets/vue/manifest.dev.json` into your VCS ignore list.
3636

3737
## Warning
3838

39-
Currently `vue.config.js` is reading configurations via `bundle exec rake vue:json_config`. You may suffer performance issue if your rake tasks are slow.
39+
Currently `vue.config.js` is reading configurations from `vue.rails.js` which depends on `js-yaml`. It will fallback to `bundle exec rake vue:json_config` without `js-yaml` installed. You may suffer performance issue if your rake tasks are slow.

lib/source/app/assets/vue/components/views/Foo.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ export default {
1212

1313
<style>
1414
#foo {
15-
color: red
15+
color: red;
1616
}
1717
</style>

lib/source/vue.config.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
11
// Please do NOT edit settings required by vue_cli-rails
22
/* [DO NOT EDIT!] begin */
3-
const { execSync } = require('child_process');
4-
const { env } = require('process');
53
const WebpackAssetsManifest = require('webpack-assets-manifest');
64
/* [DO NOT EDIT!] end */
75

86
// const CompressionWebpackPlugin = require('compression-webpack-plugin');
97
// const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
108

11-
const settings = JSON.parse(execSync('bundle exec rake vue:json_config', {
12-
cwd: __dirname,
13-
encoding: 'utf8',
14-
}));
15-
env.NODE_ENV = settings.env;
16-
const isProd = env.NODE_ENV === 'production';
17-
189
const {
1910
entry,
2011
css,
@@ -23,7 +14,8 @@ const {
2314
devServer,
2415
publicPath,
2516
manifestOutput,
26-
} = settings;
17+
isProd,
18+
} = require('./vue.rails');
2719

2820
module.exports = {
2921
outputDir,

lib/source/vue.rails.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
const { env } = require('process');
2+
3+
module.exports = (() => {
4+
let settings = {};
5+
6+
/* eslint-disable global-require,import/no-extraneous-dependencies */
7+
try {
8+
const yaml = require('js-yaml');
9+
const { readFileSync, readdirSync, lstatSync } = require('fs');
10+
const { resolve } = require('path');
11+
12+
const railsEnv = env.RAILS_ENV || 'development';
13+
const config = yaml.safeLoad(readFileSync(resolve('config/vue.yml'), 'utf8'))[railsEnv];
14+
const root = resolve(__dirname);
15+
const po = (config.public_output_path || 'vue_assets').replace(/(^\/+|\/+$)/g, '');
16+
const { manifestOutput, alias = {}, devServer = {} } = config;
17+
if (devServer.contentBase) {
18+
devServer.contentBase = resolve(root, devServer.contentBase);
19+
}
20+
const entry = {};
21+
const assetRoot = resolve(root, 'app/assets/vue/views');
22+
const findAllJsFiles = (path) => {
23+
readdirSync(path).forEach((fn) => {
24+
const filename = resolve(path, fn);
25+
const stat = lstatSync(filename);
26+
if (stat.isDirectory()) {
27+
findAllJsFiles(filename);
28+
} else if (stat.isFile() && fn.endsWith('.js')) {
29+
entry[filename.slice(assetRoot.length + 1, -3)] = filename;
30+
}
31+
});
32+
};
33+
findAllJsFiles(assetRoot);
34+
35+
settings = {
36+
...config,
37+
env: railsEnv,
38+
root,
39+
outputDir: resolve(root, 'public', po),
40+
publicPath: `/${po}/`,
41+
alias: Object.keys(alias).reduce((obj, key) => ({
42+
...obj,
43+
[key]: resolve(root, alias[key]),
44+
}), {}),
45+
manifestOutput: resolve(root, manifestOutput),
46+
devServer,
47+
entry,
48+
};
49+
} catch (e) {
50+
const { execSync } = require('child_process');
51+
52+
settings = JSON.parse(execSync('bundle exec rake vue:json_config', {
53+
cwd: __dirname,
54+
encoding: 'utf8',
55+
}));
56+
}
57+
/* eslint-enable global-require,import/no-extraneous-dependencies */
58+
59+
return {
60+
...settings,
61+
isProd: settings.env === 'production',
62+
};
63+
})();

lib/tasks/vue.rake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace :vue do
99
FileUtils.chdir root
1010
# `vue create .` and dependencies
1111
pm.exec('vue create', "-n -m #{pm.package_manager} .")
12-
pm.add '-D webpack-assets-manifest cross-env'
12+
pm.add '-D webpack-assets-manifest js-yaml'
1313
FileUtils.rm_rf root.join('src')
1414

1515
# dirs under `app`

lib/vue_cli/rails/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module VueCli
22
module Rails
3-
VERSION = "0.1.0"
3+
VERSION = "0.1.1"
44
end
55
end

0 commit comments

Comments
 (0)