2017-06-01 35 views
13

Tôi đã sử dụng official Webpack template cho Vue.js. Nó sử dụng cấu hình riêng cho environments khác nhau. Họ cung cấp thử nghiệm, phát triển và sản xuất. Tuy nhiên, tôi cần một cái khác vì chúng tôi có hai máy chủ sản xuất (một sản xuất và một dàn dựng).Xây dựng Vue.js với các biến môi trường khác nhau

Phương pháp hay nhất để có cấu hình khác nhau cho các môi trường sản xuất khác nhau là gì? Tôi sẽ nghĩ về một cái gì đó như npm run build --URL:http://some-url.com --PORT:80 ....

Mọi lời khuyên đều được hoan nghênh!

Trả lời

12

Điều này giống như một câu hỏi trên webpack hơn là Vue.js, Tôi muốn chia sẻ thiết lập trước đây của chúng tôi để xử lý các tệp và môi trường xây dựng khác nhau. trước hết, chúng tôi giữ cấu hình của chúng tôi trong thư mục riêng biệt.

config/index.js

// see http://vuejs-templates.github.io/webpack for documentation. 
var path = require('path') 

const CDN = 'https://cdnURL.com/' 

module.exports = { 
    build: { 
    env: require('./prod.env'), 
    assetsRoot: path.resolve(__dirname, '../dist'), 
    assetsSubDirectory: 'static', 
    assetsPublicPath: CDN, 
    productionSourceMap: true, 
    // Gzip off by default as many popular static hosts such as 
    // Surge or Netlify already gzip all static assets for you. 
    // Before setting to `true`, make sure to: 
    // npm install --save-dev compression-webpack-plugin 
    productionGzip: false, 
    productionGzipExtensions: ['js', 'css'], 
    productionBundleAnalyze: process.env.ANALYZE ? true : false 
    }, 
    dev: { 
    env: require('./dev.env'), 
    port: 8080, 
    assetsSubDirectory: 'static', 
    assetsPublicPath: '/', 
    proxyTable: { 
     '/api': { 
     target: process.env.npm_package_config_proxy, 
     logLevel: 'debug', 
     changeOrigin: true, 
     onProxyRes(proxyRes, req, res) { 
      // http-proxy-middleware 
      proxyRes.headers['Content-Type'] = proxyRes.headers['content-type'] 
      delete proxyRes.headers['content-type'] 
     } 
     } 
    }, 
    // CSS Sourcemaps off by default because relative paths are "buggy" 
    // with this option, according to the CSS-Loader README 
    // (https://github.com/webpack/css-loader#sourcemaps) 
    // In our experience, they generally work as expected, 
    // just be aware of this issue when enabling this option. 
    cssSourceMap: false 
    }, 
    projects: { 
    main: { 
     entry: './packages/home/index.js', 
     devPath: 'main.html', 
     target: 'web', 
     buildPath: path.resolve(__dirname, '../dist/index.html'), 
     testPath: '../packages/home/__test__/index.js' 
    }, 
    desktop: { 
     entry: './packages/desktop/index.js', 
     devPath: 'desktop.html', 
     target: 'electron-renderer', 
     buildPath: path.resolve(__dirname, '../../static/desktop.html'), 
     assetsRoot: path.resolve(__dirname, '../../'), 
     assetsSubDirectory: 'static', 
     assetsPublicPath: '../', 
     testPath: '../packages/desktop/__test__/index.js' 
    }, 
    login: { 
     entry: './packages/login/index.js', 
     devPath: 'login.html', 
     target: 'web', 
     buildPath: path.resolve(__dirname, '../dist/login.html'), 
     testPath: '../packages/login/__test__/index.js' 
    }, 
    setting: { 
     entry: './packages/setting/index.js', 
     devPath: 'setting.html', 
     target: 'web', 
     buildPath: path.resolve(__dirname, '../dist/setting.html'), 
     testPath: '../packages/setting/__test__/index.js' 
    }, 
    playground: { 
     entry: './packages/playground/index.js', 
     target: 'web' 
    } 
    } 
} 

config/dev.env.js

var merge = require('webpack-merge') 
var prodEnv = require('./prod.env') 

module.exports = merge(prodEnv, { 
    NODE_ENV: '"development"', 
    API_ROOT: '"/api"' 
}) 

config/prod.env

module.exports = { 
    NODE_ENV: '"production"', 
    API_ROOT: '"http://test.example.co/api"' //staging server 
    // API_ROOT: '"http://127.0.0.1:8787/api"' //mock-up server 
} 

trong trường hợp của nơi mà chúng tôi muốn làm việc chúng ta thay đổi API gốc ở đây.

và webpack.base.conf.js của chúng tôi trông giống như thế này. build/webpack.base.conf.js

var path = require('path') 
var config = require('../config') 
var utils = require('./utils') 
var projectRoot = path.resolve(__dirname, '../') 

const isProduction = process.env.NODE_ENV === 'production' 

module.exports = { 
    entry: utils.entrys(), 
    output: { 
    path: config.build.assetsRoot, 
    publicPath: isProduction ? config.build.assetsPublicPath : config.dev.assetsPublicPath, 
    filename: '[name].js' 
    }, 
    resolve: { 
    extensions: ['.js', '.vue', '.json'], 
    alias: { 
     'src': path.resolve(__dirname, '../src'), 
     'assets': path.resolve(__dirname, '../src/assets'), 
     'components': path.resolve(__dirname, '../src/components') 
    }, 
    unsafeCache: true 
    }, 
    target: config.projects[process.env.npm_package_config_dev].target, 
    module: { 
    rules: [ 
     { 
     test: /\.vue$/, 
     loader: 'vue-loader', 
     options: { 
      postcss: [ 
      require('postcss-cssnext')(), 
      require('lost')() 
      ], 
      cssModules: { 
      localIdentName: isProduction ? '[path][name]---[local]---[hash:base64:5]' : '[path][name]--[local]', 
      camelCase: true 
      }, 
      loaders: Object.assign({}, utils.cssLoaders()), 
      preLoaders: { 
      html: 'inline-svg-loader' 
      } 
     } 
     }, 
     { 
     test: /\.js$/, 
     loader: 'babel-loader', 
     include: projectRoot, 
     exclude: /node_modules/, 
     query: { 
      cacheDirectory: true 
     } 
     }, 
     { 
     test: /\.json$/, 
     loader: 'json-loader' 
     }, 
     { 
     test: /\.html$/, 
     loader: 'vue-html-loader' 
     }, 
     { 
     test: /\.(png|jpe?g|gif)(\?.*)?$/, 
     loader: 'url-loader', 
     query: { 
      limit: 10000, 
      name: utils.assetsPath('img/[name].[hash:7].[ext]') 
     } 
     }, 
     { 
     test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 
     loader: 'url-loader', 
     query: { 
      limit: 10000, 
      name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 
     } 
     } 
    ] 
    } 
} 

và cuối cùng package.json của chúng tôi là như thế này

... 
... 
... 
    "scripts": { 
     "dev": "webpack-dashboard -- node build/dev-server.js", 
     "dev:login": "npm config set mesh:dev login && npm run dev", 
     "dev:setting": "npm config set mesh:dev setting && npm run dev", 
     "dev:main": "npm config set mesh:dev main && npm run dev", 
     "dev:desktop": "npm config set mesh:dev desktop && node build/dev-server.js", 
     "dev:playground": " npm config set mesh:dev playground && cross-env PORT=9000 npm run dev" 
    } 
... 
... 
... 

chúng tôi sử dụng thiết lập này cho gói ứng dụng của chúng tôi cho electron, web, và webkit trong khi sử dụng các thành phần được chia sẻ.

nhưng sau này chúng tôi đã gặp phải vấn đề về hành vi scalling. và chúng tôi bắt đầu sử dụng lerna nếu bạn cần thêm một công cụ điều tiết nào đó. Tôi khuyên bạn nên kiểm tra xem nó ra.

Trân trọng.

+0

Cảm ơn bạn rất nhiều cho một lời giải thích gọn gàng như vậy! +1 Ước gì tôi có thể cho bạn nhiều điểm hơn =) –

0

Có một cách đơn giản. Trong config/prod.env.js thêm các biến của bạn như thế này:

module.exports = { 
    NODE_ENV: '"production"', 
    MY_URL: JSON.stringify(process.env.MY_URL || 'http://example.com') 
} 

Sau đó chạy xây dựng của bạn như thế này: MY_URL=http://example.org npm run build

biến của bạn sẽ có sẵn trong main.js như process.env.MY_URL

Các vấn đề liên quan