gistfile1.txt 先安装再说npm install webpack webpack-dev-server --save-dev最重要的就是 配置文件和使用指令 webpack.config.js 就是一个普通的 js 文件,符合 commonJS 规范。最后输出一个config对象,modul
先安装再说 npm install webpack webpack-dev-server --save-dev 最重要的就是 配置文件和使用指令 webpack.config.js 就是一个普通的 js 文件,符合 commonJS 规范。最后输出一个config对象,module.exports = config webpack.config.js 最重要的就是 entry output loader plugin4个配置项 麻烦的就是loader和plugin这两项 简单的范例 module: { loaders: [ { test: /\.js?$/, //加载非node_module中的.js exclude: /(node_modules)/, loader: 'babel-loader', query: { //下面两项不就是 Babel 的配置文件是.babelrc中关键两项么,存放在项目的根目录下。一下子全在webpack.config.js中配置了 presets: ['react', 'es2015'], plugins: ['react-html-attrs'], //添加组件的插件配置 } }, { test: /\.css$/, loader: 'style-loader!css-loader' }, //.css { test: /\.ts$/, use: 'ts-loader' }, ] } 复杂点的loader 比如要加载jquery bootstrap 文件里面就可以直接用$符号了 使用expose-loader 解决第三方库的插件依赖 你要做三步 第一 安装 node模块 npm install jquery --save npm install bootstrap --save 第二 安装 expose-loader npm install expose-loader --save-dev 第三 修改webpack.config.js 比如简单点的如下 module.exports = { loaders: [{ // 得到jquery模块的绝对路径,这个jquery要跟第一步指令里面的jquery名称完全一致 test: require.resolve('jquery'), // 将jquery绑定为window.jQuery loader: 'expose?jQuery' }] }; 复杂点的moudule范例 module: { // loaders: [ {test: require.resolve("jquery"), loader: "expose?jQuery"}, {test: require.resolve("jquery"), loader: "expose?$"}, {test: /\.css$/, loader: ExtractTextPlugin.extract("style", "css!postcss")}, { test: /\.js$/, exclude: /(node_modules)/, loader: ["babel-loader"], query: { presets: ["es2015"] } } ], } 注意对于css的ExtractTextPlugin插件 要先安装 # for webpack 3 npm install --save-dev extract-text-webpack-plugin # for webpack 2 npm install --save-dev extract-text-webpack-plugin@2.1.2 # for webpack 1 npm install --save-dev extract-text-webpack-plugin@1.0.1 plugins: [ new ExtractTextPlugin("[name].bundle.css", { //从你的包中提取文本(CSS)到一个单独的文件 allChunks: true }), new webpack.ProvidePlugin({ //就一般在使用 jQuery时候配置 这样代码中 $('#item')和jQuery('#item')都会生效 $: "jquery", jQuery: "jquery", "window.jQuery": "jquery" }), new CleanPlugin(PATH.BUILD_PATH, { //clean-webpack-plugin用于在building之前删除你以前build过的文件 root: PATH.ROOT_PATH, verbose: true }), new HtmlWebpackPlugin({ filename: 'index.html', template: 'src/index.html', chunks: ['index'] }) ] 注意:要提前安装好 npm install clean-webpack-plugin --save-dev 并且config文件开头声明 var CleanWebpackPlugin = require('clean-webpack-plugin'); 同理 其他也是,我下面给出标准的完整版config文件webpack.config.js
const webpack = require('webpack'); const ExtractTextPlugin = require("extract-text-webpack-plugin"); const CleanPlugin = require('clean-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const postcssImport = require("postcss-import"); const cssnext = require("postcss-cssnext"); const PATH = require('./path'); const path = require('path'); const fs = require('fs'); const entryFiles = fs.readdirSync(PATH.ENTRY_PATH); const files = []; const entries = {}; entryFiles //暂时不用管 .filter(file => file.split('.')[0] && file.split('.').slice(-1)[0] === 'js' ) .forEach(file => { const filename = file.split('.')[0]; const filepath = path.join(PATH.ENTRY_PATH, file) entries[filename] = filepath; }); module.exports = { entry: { index: './src/js/index.js' }, output: { filename: '[name].bundle.js', path: PATH.BUILD_PATH }, module: { // loaders: [ {test: require.resolve("jquery"), loader: "expose?jQuery"}, {test: require.resolve("jquery"), loader: "expose?$"}, {test: /\.css$/, loader: ExtractTextPlugin.extract("style", "css!postcss")}, { test: /\.js$/, exclude: /(node_modules)/, loader: ["babel-loader"], query: { presets: ["es2015"] } } ], }, resolve: { //resolve配置用来影响webpack模块解析规则 不配也行 extensions: ['', '.js', '.jsx'], }, postcss: function() { return [ postcssImport({addDependencyTo: webpack}), cssnext({autoprefixer: {browsers: "ie >= 9, ..."}}) //兼容浏览器 ]; }, plugins: [ new ExtractTextPlugin("[name].bundle.css", { //从你的包中提取文本(CSS)到一个单独的文件 allChunks: true }), new webpack.ProvidePlugin({ //就一般在使用 jQuery时候配置 这样代码中 $('#item')和jQuery('#item')都会生效 $: "jquery", jQuery: "jquery", "window.jQuery": "jquery" }), new CleanPlugin(PATH.BUILD_PATH, { //clean-webpack-plugin用于在building之前删除你以前build过的文件 root: PATH.ROOT_PATH, verbose: true }), new HtmlWebpackPlugin({ //这个配置文件还写了多入口 但是没有开启 如果是多入口 就要配置这一项 对应加入多个HtmlWebpackPlugin块 filename: 'index.html', //filename:输出的html文件名称 template: 'src/index.html', //template:模板文件路径所在位置 chunks: ['index'] //chunks:包含的文件,可以entry和其他模块chunk的模块 }) ], debug: true, displayErrorDetails: true, outputPathinfo: true, devtool: "cheap-module-eval-source-map" }; 关于多入口配置项的说明: 一般咱们只生成一个index.html 但是如果想生成 多个html 就需要改改上面的配置来用了 ├── package.json # 项目配置 ├── src # 源码目录 │ ├── pageA.html # 入口文件a │ ├── pageB.html # 入口文件b │ ├── css/ # css资源 │ ├── img/ # 图片资源 │ ├── js # js&jsx资源 │ │ ├── pageA.js # a页面入口 │ │ ├── pageB.js # b页面入口 │ │ ├── lib/ # 没有存放在npm的第三方库或者下载存放到本地的基础库,如jQuery、Zepto、avalon │ ├── pathmap.json # 手动配置某些模块的路径,可以加快webpack的编译速度 ├── webpack.config.js # webpack配置入口path.js 把路径统一放在这里配置 这个文件可以放在根目录下面 配合上面的webpack.config.js
const path = require('path'); const CURRENT_PATH = path.resolve(__dirname); // 获取到当前目录 const ROOT_PATH = path.join(__dirname); // 项目根目录 const MODULES_PATH = path.join(ROOT_PATH, './node_modules'); // node包目录 const BUILD_PATH = path.resolve(ROOT_PATH, 'build'); // 最后输出放置公共资源的目录 const SERVER_PATH = '/assets/'; const ENTRY_PATH = path.join(ROOT_PATH, './src/js'); // webpack入口文件 module.exports = { ROOT_PATH, BUILD_PATH, SERVER_PATH, CURRENT_PATH, ENTRY_PATH };