:arrow: 1. 纯前端的打包输出,比较有局限 2.目录结构 |--build |--app |--base //基础核心文件,譬如jQuery,公共Util等 |--css |--images |--plugins //jQuery插件 |--jquery.lazyload.js |--page //功能页面模块,每个模块至少包含一个和文件夹同名的js,作为打包入口 |--common |--orderCommon.js |--xxx.js |--orderDetail |--orderDetail.js |--orderList |--orderList.js |--search |--search.js |--searchHelper.js |--abc |--abc.js |--vendor.js // 全站公用文件
//vendor.js import $ from 'jQuery'; import "plugins/jquery.lazyload"; import Util from "app/base/Util"; require('app/css/page/global.css'); //orderDetail.js import Util from "app/base/Util"; var orderCommon = null; var orderDetail = { init: function(){ // } }; //异步加载,确保orderCommon将被分割为单独文件加载 require.ensure(['app/page/common/orderCommon'],function(orderCommon){ orderCommon = orderCommon; orderDetail.init(); });
//webpack.config.js
var webpackDevHost = 'localhost' var path = require('path'), webpack = require('webpack'), ExtractTextPlugin = require('extract-text-webpack-plugin'), Clean = require('clean-webpack-plugin'), HtmlWebpackPlugin = require('html-webpack-plugin'); var glob = require('glob'); var AssetsPlugin = require('assets-webpack-plugin'); const BUILD_DIRECTORY = 'build'; const BUILD_DROP_PATH = path.resolve(__dirname, BUILD_DIRECTORY); var ENV_PRO = false; var entry = (function getEntry(){ var entry = {}; var result = glob.sync(path.join('./app/page', '**/*.js')); //获取page下目录,符合 page/xxx/xxx.js 的,将被视为entry入口。 result.forEach( function(name) { var folder = name.split('/')[2], filename = name.split('/')[3]; if(folder !== 'common' && folder + '.js' === filename){ entry[name.split('/').pop().split('.').shift()] = name; } }); //额外的附加入口 entry.vendor = './app/page/vendor.js'; entry.jqueryui = './app/page/jqueryui.js'; // console.log(JSON.stringify(entry)); return entry; })(); module.exports = { // devtool: 'eval', // 'webpack-dev-server/client?http://' + webpackDevHost + ':' + webpackDevPort, // 'webpack/hot/only-dev-server', entry: entry, output: { path: path.join(__dirname, './build2'), filename: ENV_PRO ? '[name].[chunkhash].js': '[name].js', chunkFilename: ENV_PRO ? "[id].[chunkhash].js" : '[id].js', pathinfo: ENV_PRO ? true : false, publicPath: 'http://192.168.91.250:1234/build2/' }, plugins: [ // new webpack.HotModuleReplacementPlugin(), // new webpack.NoErrorsPlugin() new Clean(['build2']) // ,new webpack.ProvidePlugin({ // $: "jquery", // jQuery: "jquery", // "window.jQuery": "jquery" // }) ,new ExtractTextPlugin( ENV_PRO ? "[name].[hash].css" : '[name].css') // ,new webpack.optimize.CommonsChunkPlugin({ // name: "c-commons", // chunks: ["orderDetail", "orderList"] // }) ,new webpack.optimize.CommonsChunkPlugin({ name: "vendor", filename: ENV_PRO ? 'vendor.[chunkhash].js' : 'vendor.js' ,minChunks: Infinity }) ,new AssetsPlugin({ filename: 'webpack.assets.json', path: path.join(__dirname, './build2'), prettyPrint: true }) // ,new uglifyJsPlugin({ // compress: { // warnings: false // } // }) ], resolve: { alias: { app: path.join(__dirname, '/app'), base: path.join(__dirname, '/app/base'), page: path.join(__dirname, '/app/page'), plugins: path.join(__dirname, '/app/plugins'), jquery: path.join(__dirname, '/app/base/jquery.pack.js'), jQuery: path.join(__dirname, '/app/base/jquery.pack.js'), $: path.join(__dirname, '/app/base/jquery.pack.js') }, extensions: ['', '.js', '.jsx'] }, module: { loaders: [{ test: /jquery.pack.js/, loader: 'expose?$!expose?jQuery!' },{ test: /plugins\/jquery\..+\.js$/, loader: 'imports?jQuery=jquery,$=jquery,this=>window' },{ test: /\.(js|jsx)$/, exclude: /(node_modules)/, loader: 'babel?presets[]=es2015,presets[]=stage-3' },{ test: /\.scss$/, loader: ExtractTextPlugin.extract("style-loader",'css-loader!sass-loader') }, { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader",'css-loader') },{ test: /\.(jpe?g|png|gif)$/, loader: 'url?limit=8192&name=images/[hash].[ext]' }, { test: /\.(woff|woff2|eot|ttf|svg)$/, loader: 'url?limit=8192' }, { test: /\.html/, loader: 'raw' }, { test: /\.json/, loader: 'json' }] } }
package.json
{ "name": "site_pc", "repository": "", "version": "1.1.0", "main": "webpack.config.js", "scripts": {}, "license": "ISC", "devDependencies": { "assets-webpack-plugin": "^3.3.0", "babel-core": "^6.1.21", "babel-loader": "^6.1.0", "babel-polyfill": "^6.3.14", "babel-preset-es2015": "^6.1.4", "babel-preset-stage-3": "^6.1.2", "clean-webpack-plugin": "^0.1.4", "css-loader": "^0.23.0", "es6-promise": "^3.0.2", "expose-loader": "^0.7.1", "imports-loader": "^0.6.5", "extract-text-webpack-plugin": "^0.9.1", "html-loader": "^0.3.0", "html-webpack-plugin": "^1.6.2", "imports-loader": "^0.6.5", "json-loader": "^0.5.3", "nib": "^1.1.0", "node-sass": "^3.4.2", "raw-loader": "^0.5.1", "sass-loader": "^3.1.2", "style-loader": "^0.13.0", "url-loader": "^0.5.6", "webpack": "^1.12.4", "webpack-dev-server": "^1.12.1", "webpack-manifest-plugin": "^1.0.0" } }